我发现words
是分割String
的适当函数:
words :: String -> [String]
使这段代码有效的fmap
有什么特别之处:
Prelude> fmap words getLine
abc def ghi
["abc","def","ghi"]
并且它的遗漏会导致错误:
Prelude> words getLine
<interactive>:10:7: error:
• Couldn't match type ‘IO String’ with ‘[Char]’
Expected type: String
Actual type: IO String
• In the first argument of ‘words’, namely ‘getLine’
In the expression: words getLine
In an equation for ‘it’: it = words getLine
我知道fmap
适用于Functors
,但我还不了解Functors
。它与此有关吗?
答案 0 :(得分:3)
getLine
会返回IO String
,因此words getLine
是类型错误。 fmap
的类型为
Functor f => (a -> b) -> f a -> f b
和IO
有一个仿函数实例,因此fmap
的{{1}}类型为IO
。因此,(a -> b) -> IO a -> IO b
的类型为fmap words
,将此结果应用于IO String -> IO [String]
的结果会产生getLine
。
在ghci中,执行了IO [String]
个动作并打印了结果,这就是您显示结果列表的原因。