Haskell多文件内容输出实现问题及代码修改方案求解
Haskell多文件读取问题修复方案
问题根因
你提供的代码仅能输出单个内容的核心问题出在main函数的输出逻辑:putStrLn (head contents)仅取读取结果列表的第一个元素打印,其余所有结果(包括其余文件的内容、其余路径的错误提示)都被直接丢弃。
修复后完整代码
module Main where import System.Environment import System.IO (readFile) import System.Directory main :: IO () main = do fs <- getArgs contents <- readFiles fs putStr $ concat 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)
改动说明
- 仅修改
main函数的输出逻辑即可实现需求:将所有读取结果按路径传入顺序拼接后统一输出,错误提示和存在的文件内容都会按顺序打印,完全符合你给出的示例输出要求。 - 也可以使用
mapM_ putStr contents替代putStr $ concat contents,二者运行效果完全一致。
内容的提问来源于stack exchange,提问作者Ryan Harding
相关产品推荐
相关产品推荐

