为什么我要用mapM编写id

Cha*_*had 0 haskell

我有以下方法:

nucleotideComplement :: Char -> Either String Char
nucleotideComplement 'G' = Right 'C'
nucleotideComplement 'C' = Right 'G'
nucleotideComplement 'T' = Right 'A'
nucleotideComplement 'A' = Right 'U'
nucleotideComplement x = Left "Not a valid RNA nucleotide."
Run Code Online (Sandbox Code Playgroud)

并想要定义另一个:

toRNA :: String -> String
toRNA = either error mapM nucleotideComplement
Run Code Online (Sandbox Code Playgroud)

但是我在这里遇到了类型错误.但是这样做似乎解决了这个问题:

toRNA :: String -> String
toRNA = either error id . mapM nucleotideComplement
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会这样

首先,id有类型a -> a.接下来,让类型(时:t)的mapM nucleotideComplementid . mapM nucleotideComplement,他们似乎是相同的.为什么我会得到这样不同的效果?

希望有人能够进一步澄清这一点.

Mat*_*hid 12

我觉得你读错了......

either error id . mapM nucleotideComplement
Run Code Online (Sandbox Code Playgroud)

你似乎认为这意味着

either error (id . mapM nucleotideComplement)
Run Code Online (Sandbox Code Playgroud)

实际上它意味着什么

(either error id) . (mapM nucleotideComplement)
Run Code Online (Sandbox Code Playgroud)

你没有做id . mapM nucleotideComplement任何事情.你正在申请mapM,然后将结果传递给either,这将适用errorid取决于它是否看到LeftRight.