我正在撰寫可以讀取目錄中的一個或多個檔案的代碼,但在輸出兩個文本檔案的內容(在我的情況下)時遇到問題。我的代碼目前可以在終端中輸出任一文本檔案的內容,但不能同時輸出兩者。如果檔案或目錄不存在,我還包含了一條錯誤訊息。我還想修改我的代碼,以便如果目錄中只存在一個文本檔案,它會輸出該檔案的內容,并在第二個檔案同時不存在時提供錯誤訊息,如下所示:
cabal -v0 運行 cat test/loremm.txt test/haiku.txt(目錄中不存在 loremm.txt)
輸出:cat: test/loremm.txt: 沒有這樣的檔案或目錄\nHaskell 的神秘形式\對某些人來說很自然\n所以俳句\n"
我的代碼:
module Main where
import System.Environment
import System.IO (readFile)
import System.Directory
main :: IO ()
main = do fs <- getArgs
contents <- readFiles fs
putStrLn (head contents)
readFiles :: [String] -> IO [String]
readFiles [] = return []
readFiles (x:xs) = do
doesExist <- doesFileExist x
if doesExist then do
contents <- readFile x
others <- readFiles xs
return (contents:others)
else do
others <- readFiles xs
return (("cat: " x ": No such file or directory\n") : others)
uj5u.com熱心網友回復:
該contents變數在main是含有每個檔案的字串,其中包含每個的內容的串列。因此,執行putStrLn (head contents)僅列印第一個檔案的內容。你可能的意思是putStrLn (concat contents)。
在一個不相關的注釋中,您的readFiles方法用 撰寫會簡單得多traverse,如下所示:
readFiles = traverse $ \x -> do
doesExist <- doesFileExist x
if doesExist then
readFile x
else
return ("cat: " x ": No such file or directory\n")
注意這一點的方法是,您所做的基本上是 a map,除了每個事物的結果型別都包含在IOmonad 中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316805.html
標籤:哈斯克尔
上一篇:使用組合來獲得除法的上限
