[英]Fighting IO when reading a configuration file into Haskell
我有用于我尚未编写的 Haskell 应用程序的输入数据,这些数据驻留在一个文件中。 我不更新文件。 我只需要读取文件并将其输入到需要字符串列表的 Haskell 函数中。 但是读取文件当然会产生IO
数据对象。 我了解到使用<-
操作可以以某种方式“取出”打包在IO
结构中的字符串,因此我尝试了以下尝试:
run :: [String]
run = do
datadef_content <- readFile "play.txt" -- yields a String
let datadef = lines datadef_content -- should be a [String]
return datadef
我把它放到一个文件play.hs
并从 ghci 加载它
:l play
令我惊讶的是,我收到了readFile
行的错误消息
Couldn't match type 'IO' with '[]' Expected type: [String] Actual type: IO String
并return
错误消息
Couldn't match type '[Char]' with 'Char' Expected type: [String] Actual type: [[String]]
第一个似乎表明,我无法摆脱的IO
,以及最后的消息似乎表明,该lines
将返回字符串,这也没有任何意义,我的名单列表。
我怎样才能正确地做到这一点?
您将run
声明为[String]
值。 但是return
不是提供函数返回值的关键字; 它是一个函数,类型为Monad m => a -> ma
。 return datadef
产生一个IO [String]
类型的值,它成为函数的返回值。
解决方案是为run
提供正确的返回类型:
run :: IO [String]
run = do
...
run
也可以更简洁地定义为
run = fmap lines (readFile "play.txt")
尽管do
语法表明是,但无法从IO
操作中提取值; 您所能做的就是将lines
调用“推送”到操作中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.