在haskell中拆分使用和不使用fmap的输入读取的行

时间:2018-03-01 08:51:40

标签: haskell

我发现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。它与此有关吗?

1 个答案:

答案 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]个动作并打印了结果,这就是您显示结果列表的原因。