Haskell读取文件行

Leo*_*onS 11 io haskell file

我想将整个文件读入一个字符串,然后使用该函数lines来获取字符串的行.我正在尝试使用以下代码行:

main = do
   args <- getArgs
   content <- readFile (args !! 0)
   linesOfFiles <- lines content
Run Code Online (Sandbox Code Playgroud)

但我通过编译广告失败得到以下错误:

Couldn't match expected type `IO t0' with actual type `[String]'
In the return type of a call of `lines'
In a stmt of a 'do' block: linesOfFiles <- lines content
Run Code Online (Sandbox Code Playgroud)

我认为通过将结果绑定readFile到内容它将是一个StringDataType,为什么不是呢?

Dan*_*her 35

我认为通过将readFile的结果绑定到内容它将是一个String DataType,为什么不呢?

这是一个String确实,这不是什么编译器抱怨.我们来看看代码:

main = do
   args <- getArgs
   content <- readFile (args !! 0)
Run Code Online (Sandbox Code Playgroud)

现在content,根据需要,平原String.然后lines content是一个[String].但是你在下一行使用monadic绑定

   linesOfFiles <- lines content
Run Code Online (Sandbox Code Playgroud)

在一个IO ()块中.所以编译器期望IO something在右侧有一个类型的表达式<-,但它找到了一个[String].

由于计算lines content不涉及任何IO,您应该将其结果与let绑定而不是monadic绑定绑定,

   let linesOfFiles = lines content
Run Code Online (Sandbox Code Playgroud)

是你需要的那条线.

  • @kjh不,`content`是一个`String`。“ readFile(args !! 0)”的类型是“ IO字符串”,我们将“内容”绑定到该“ IO”操作的“结果”。构造`do {a &lt;-action; 东西; }`减为“ action &gt;&gt; = \ a-&gt; stuff”,如果“ action”的类型为“ IO t”,则“ a”的类型为“ t”。 (2认同)