转发通知,这是我Haskell的第一天.
所以我有一个函数parse :: String -> String,我试图通过标准传递一个文件,
input <- readFile "input.txt"
Run Code Online (Sandbox Code Playgroud)
或其他标准,
handle <- openFile "input.txt" ReadMode
input <- hGetContents handle
Run Code Online (Sandbox Code Playgroud)
我想要表演的,
output <- unlines $ map parse $ lines input
Run Code Online (Sandbox Code Playgroud)
(或者应该是规范格式化的)
现在我理解它,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
Run Code Online (Sandbox Code Playgroud)
在你的例子中一切都很好,除非你output <-应该用let output =你可能还没有得到的原因替换它,判断你的措辞:readFile返回一个字符串.正如评论中指出的那样,事实并非如此.它返回IO String意味着您可以启动并获取字符串的IO动作(或者不是......如果文件不存在).该<-操作允许您检查此操作的积极结果:它表示当操作成功时,您将获得一个字符串(您调用它input).然后你可以玩它.
那么,为什么<-没有在第二行(在适当的lines,map和东西)?仅仅因为它没有动作.你在那里应用纯函数.绑定纯计算的结果是通过let smth =.
另外,请注意,<-除了let X =属于do-blocks之外,还有一些语法结构,用于编写一系列步骤来处理操作.相反,在纯函数内部,您可以找到let X = … in(注释in)或where X =绑定中间结果.