Haskell递归处理文本文件每行并拼接字符串长度,不使用fmap
解决思路
你既然熟悉列表的递归处理,我们可以单独封装一个接收文件句柄的递归辅助函数,每次读取一行、处理完成后递归调用自身处理剩余内容,直到读完整个文件即可。
现有代码的问题
- 片段1存在语法错误,
hGetLine调用漏传文件句柄参数,hGetContents后的绑定逻辑也不符合语法规范 - 片段2只是重复读取了两行内容,没有递归逻辑,且用空行判断终止逻辑会误判文件里的正常空行,也无法处理未知行数的文件
修改后的完整代码
import System.IO main :: IO () main = do -- 请将此处文件名替换为你的测试文件实际路径 fileHandle <- openFile "test.txt" ReadMode processLines fileHandle hClose fileHandle -- 递归处理文件所有行的辅助函数 processLines :: Handle -> IO () processLines handle = do -- 先判断是否到达文件末尾 isFileEnd <- hIsEOF handle if isFileEnd then return () else do currentLine <- hGetLine handle putStrLn $ currentLine ++ " has a length of " ++ show (length currentLine) -- 递归处理剩余行 processLines handle
逻辑说明
- 递归函数
processLines每次执行先检查是否读到文件末尾,是的话就终止递归 - 未到末尾时读取当前行、按要求输出结果,再调用自身处理后续内容
- 全程没有用到functor/fmap相关特性,都是基础的递归和IO操作,符合你的需求
内容的提问来源于stack exchange,提问作者ppch
相关产品推荐
相关产品推荐

