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)。然后你可以玩它。

那么为什么<-不适合在第二行(与linesmap和东西)?仅仅因为它没有动作。你在那里应用纯函数。绑定纯计算的结果是通过let smth =完成的。

此外,请注意,<-以及let X =属于do-blocks,句法结构旨在编写一系列步骤来处理操作。相反,在纯函数内部,您可以找到let X = … in(注意in)或where X =来绑定中间结果。

以上是关于Haskell文件I / O返回类型不匹配?的主要内容,如果未能解决你的问题,请参考以下文章

Haskell -- 并发 I/O 路由

Haskell类型与csv解析不匹配

Haskell 无法将预期类型“[(Char,b0)]”与实际类型“(Char,Int)”匹配

函数返回与函数参数中的 Haskell 模式匹配

Haskell:未经请求的unicode字符在i / o中转义

TLPI(liunx/unix系统编程手册)笔记 深入探究文件I/O