如何在Haskell中收集管道输出到文件

时间:2012-09-29 09:54:20

标签: haskell conduit

我有一个生产者管道,我使用了打印管道。我想将输出写入文件。 如果我使用Control.Data.sinkFile,比如

test2file = runPipe $ CB.sinkFile "testOutput" <+< traverseTree fn3 

我收到类型错误:

Couldn't match expected type `Pipe
                                b0 void-0.5.8:Data.Void.Void m0 r0'
            with actual type `Data.Conduit.Internal.Pipe
                                l0 Data.ByteString.Internal.ByteString o0 r1 m1 r1'
In the return type of a call of `sinkFile'
In the first argument of `(<+<)', namely `sinkFile "testOutput"'

如何将sinkFile转换为可以组合的管道。是否存在严格与懒惰的问题?

1 个答案:

答案 0 :(得分:2)

解决方案很简单,编写一个fileSink函数,该函数附加到文件

fileSink = forever $ do 
inp <- await
liftIO $ appendFile "testOutput" ('\n' : show inp )
return () 

使用文件句柄可能更有效,更实用,将文件名作为参数传递。使用管道真的很容易!