折叠递归递归?

时间:2016-06-27 19:08:10

标签: haskell recursion fold

我编写了这段代码,循环遍历文件句柄的行并对其执行任意操作。我不认为它应该是递归的 - 我可以把它变成折叠动作吗?

谢谢!

processHandle :: Handle -> (String->IO ()) -> IO ()
processHandle h fn = do
                   eof <- hIsEOF h
                   if eof then
                     return ()
                    else do
                      myLine <- hGetLine h
                      fn myLine
                      processHandle h fn

1 个答案:

答案 0 :(得分:6)

在Haskell中非常避免手动处理句柄。它与函数式编程风格并不能很好地协同工作。

对于像这样的简单输入处理器,将整个文件作为一个(懒惰)字符串读取可能是最好的,并处理其中的行:

processHandle h fn = mapM_ fn . lines =<< hgetContents h

当然,这也可以写成折叠,只需查看the definition of mapM_

现在,这种懒惰的IO方法对许多严肃的应用程序也不起作用。如果这不是一个巨大的文件,那么如果你只是严格阅读文件with the Data.Text equivalent,那么你可能会很好。另外,如果您确实需要读取与处理步骤交错的行,请更好地查看conduit