[英]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.