我想将整个文件读入一个字符串,然后使用函数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
的结果绑定到内容,它将是String
数据类型,为什么不呢?
答案 0 :(得分:33)
我认为通过将readFile的结果绑定到内容它将是一个String DataType,为什么不是呢?
确实是String
,这不是编译器所抱怨的。我们来看看代码:
main = do
args <- getArgs
content <- readFile (args !! 0)
现在content
根据需要是String
。然后lines content
是[String]
。但是你在下一行使用monadic绑定
linesOfFiles <- lines content
在IO ()
块中。因此,编译器需要IO something
右侧的<-
类型的表达式,但它会找到[String]
。
由于计算lines content
不涉及任何IO
,因此您应将其结果与let
绑定绑定,而不是使用monadic绑定,
let linesOfFiles = lines content
是你需要的那条线。