2016-06-27 53 views
1

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

谢谢!

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 
+0

我想你刚刚写下了你寻求的折叠式动作!本质上没有实际的折叠,因为你没有一个实际的容器充满了值,而是一个让你使用I/O来获取值的句柄。 – dfeuer

回答

6

Haskell非常避免手动使用手柄。它不能与函数式编程风格一起玩。

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

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

当然,这也可以在被写为折叠,只需查找the definition of mapM_即可。

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

+0

哦,聪明。谢谢。 – Carbon