簡體   English   中英

將配置文件讀入 Haskell 時發生 IO

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM