我有以下方法:
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 nucleotideComplement和id . 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,这将适用error或id取决于它是否看到Left或Right.