Как собрать вывод из каналов в файл в Haskell

У меня есть канал производителя, и я использовал канал печати. Я хотел бы записать вывод в файл. Если я использую 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 в канал, который можно составить. есть ли строгий или ленивый вопрос?


person user855443    schedule 29.09.2012    source источник
comment
Является ли traverseTree функцией, которую вы определили?   -  person huon    schedule 29.09.2012
comment
это труба (производитель), которая работала с testP1 = ​​runPipe $ принтер ‹+‹ traverseTree fn3 см. мой qeustion обход в ширину...   -  person user855443    schedule 29.09.2012
comment
Я думаю, вы смешиваете трубы и код канала.   -  person Gabriel Gonzalez    schedule 29.09.2012


Ответы (1)


решение простое, написание функции fileSink, которая добавляется к файлу

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

может быть более эффективно использовать дескриптор файла и более практично передавать имя файла в качестве аргумента. использовать трубы очень просто!

person user855443    schedule 29.09.2012