Car*_*bon 1 recursion haskell 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
Run Code Online (Sandbox Code Playgroud)
在Haskell中,手动处理句柄非常容易.它与功能编程风格不兼容.
对于像这样的简单输入处理器,最好只将整个文件作为一个(懒惰)字符串读取,并处理其中的行:
processHandle h fn = mapM_ fn . lines =<< hgetContents h
Run Code Online (Sandbox Code Playgroud)
当然这也可以写成折叠,只需查看定义即可mapM_
.
现在,这种懒惰的IO方法对许多严肃的应用程序都不起作用.如果这不是一个巨大的文件,那么如果你只是用Data.Text
相同的文件严格阅读文件,那么你可能会很好.另外,如果您确实需要读取与处理步骤交错的行,请更好地查看管道.