我對IO有點了解。我了解您可以使用它readFile來獲取檔案的內容。例如像這樣:
main = do
let inputFilePath = "C:\\Haskell\\myawesomeprogram\\files\\a.txt"
content <- readFile inputFilePath
print content
呼叫程式:
> runghc myawesomeprogram
"AAA"
太棒了,這行得通!現在我想從多個檔案中讀取內容。我試過這樣的事情:
files = ["C:\\Haskell\\myawesomeprogram\\files\\a.txt", "C:\\Haskell\\myawesomeprogram\\files\\b.txt","C:\\Haskell\\myawesomeprogram\\files\\c.txt"]
main :: IO ()
main = do
filesContent <- readFiles files
print filesContent
readFiles (x:xs) = do
content <- readFile x
content : readFiles xs
這會給我以下錯誤訊息:
myawesomeprogram.hs:6:21: error:
* Couldn't match type `[]' with `IO'
Expected type: IO String
Actual type: [String]
* In a stmt of a 'do' block: filesContent <- readFiles files
In the expression:
do filesContent <- readFiles files
print filesContent
In an equation for `main':
main
= do filesContent <- readFiles files
print filesContent
|
6 | filesContent <- readFiles files
| ^^^^^^^^^^^^^^^
myawesomeprogram.hs:9:1: error:
Couldn't match type `IO' with `[]'
Expected type: [FilePath] -> [String]
Actual type: [FilePath] -> IO String
|
9 | readFiles (x:xs) = do
| ^^^^^^^^^^^^^^^^^^^^^^^...
myawesomeprogram.hs:11:5: error:
* Couldn't match type `[]' with `IO'
Expected type: IO String
Actual type: [String]
* In a stmt of a 'do' block: content : readFiles xs
In the expression:
do content <- readFile x
content : readFiles xs
In an equation for `readFiles':
readFiles (x : xs)
= do content <- readFile x
content : readFiles xs
|
11 | content : readFiles xs
| ^^^^^^^^^^^^^^^^^^^^^^
我做錯了什么,但是,我看不到正確的方法。你能以正確的方式做嗎?
uj5u.com熱心網友回復:
readFiles xs不是一個串列,所以你不能在它前面添加一個專案。相反,它是一個action,執行時會生成一個串列。
更具體地說,readFiles xsis IO [String](IO是可執行操作的型別) 的型別,而串列將具有 type [String]。這就是錯誤訊息告訴您的內容:無法將型別IO [String]與[String].
因此,要獲取串列,您必須執行操作,就像您正在執行一樣readFile
readFiles (x:xs) = do
content <- readFile x
theRest <- readFiles xs
pure (content : theRest)
另請注意,readFiles當它的引數是一個空串列時,它不知道該怎么做。您應該在編譯時收到有關它的警告,如果您不修復它,您將在運行時崩潰。
要修復,只需為空串列情況添加一個方程式:
readFiles [] = pure []
readFiles (x:xs) = do
content <- readFile x
theRest <- readFiles xs
pure (content : theRest)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/427259.html
