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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在haskell中拆分使用和不使用fmap的输入读取的行相关的知识,希望对你有一定的参考价值。

我发现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 

我知道fmapFunctors合作,但我还不知道Functors。它与此有关吗?

答案

getLine返回一个IO String,所以words getLine是一个类型错误。 fmap有类型

Functor f => (a -> b) -> f a -> f b

IO有一个仿函数实例,所以fmapIO有类型(a -> b) -> IO a -> IO bfmap words因此具有IO String -> IO [String]类型,并将其应用于getLine的结果导致IO [String]

在ghci中,执行IO动作并打印结果,这就是您显示结果列表的原因。

以上是关于在haskell中拆分使用和不使用fmap的输入读取的行的主要内容,如果未能解决你的问题,请参考以下文章

为什么在fmap方法参数后评估getArgs?

使用 SSIS OR T-SQL 将一列带引号和不带引号的逗号分隔值拆分为多列

vba 拆分功能的类型错误和不匹配

在javascript中将字符串拆分为匹配和不匹配的组

使用 IO.readLn 从 Haskell 中的标准输入读取单行

有没有办法在 Quartz Scheduler 中拆分读/写查询以使用 mysql 主从复制?