Haskell文件I / O返回类型不匹配?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Haskell文件I / O返回类型不匹配?相关的知识,希望对你有一定的参考价值。
转发通知,这是我在Haskell的第一天。
所以我有一个函数parse :: String -> String
,我试图通过标准传递一个文件,
input <- readFile "input.txt"
或其他标准,
handle <- openFile "input.txt" ReadMode
input <- hGetContents handle
我想要表演的,
output <- unlines $ map parse $ lines input
(或者应该以规范格式)
现在据我所知,readFile返回一个字符串,lines接受一个字符串并返回一个字符串列表,map应该映射一个字符串列表。如果这是真的,那么为什么lines input
告诉我有一个[String]而不是String,而省略lines
并且只是让map parse input
告诉我它有一个String而不是[String]?
这是工作示例
parse :: String -> String
parse = id -- don't do anything to input
main = do
input <- readFile "input.txt"
let output = unlines $ map parse $ lines input
print output
在你的例子中一切都很好,除了output <-
应该用let output =
替换你可能还没有得到的原因,判断你的措辞:readFile
返回一个字符串。正如评论中指出的那样,事实并非如此。它返回IO String
,这意味着您可以启动并获取字符串的IO动作(或者不是......如果文件不存在)。 <-
操作允许您检查此操作的积极结果:它表示当操作成功时,您会得到一个字符串(您称之为input
)。然后你可以玩它。
那么为什么<-
不适合在第二行(与lines
,map
和东西)?仅仅因为它没有动作。你在那里应用纯函数。绑定纯计算的结果是通过let smth =
完成的。
此外,请注意,<-
以及let X =
属于do-blocks,句法结构旨在编写一系列步骤来处理操作。相反,在纯函数内部,您可以找到let X = … in
(注意in
)或where X =
来绑定中间结果。
以上是关于Haskell文件I / O返回类型不匹配?的主要内容,如果未能解决你的问题,请参考以下文章
Haskell 无法将预期类型“[(Char,b0)]”与实际类型“(Char,Int)”匹配