You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 19:30:01