20

我想将整个文件读入一个字符串,然后使用该函数lines来获取字符串的行。我正在尝试使用这些代码行来做到这一点:

main = do
   args <- getArgs
   content <- readFile (args !! 0)
   linesOfFiles <- lines content

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

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

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

4

1 回答 1

48

我认为通过将 readFile 的结果绑定到内容,它将是一个字符串数据类型,为什么不是呢?

确实String,这不是编译器所抱怨的。让我们看一下代码:

main = do
   args <- getArgs
   content <- readFile (args !! 0)

现在content,根据需要,是一个普通的String. 然后lines content是一个[String]。但是你在下一行使用一元绑定

   linesOfFiles <- lines content

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

由于计算lines content不涉及任何,您应该使用绑定而不是单子绑定来IO绑定其结果,let

   let linesOfFiles = lines content

是你需要的那条线。

于 2012-06-13T20:04:23.410 回答