[英]How to merge two Consumer into one in Haskell Pipes?
我使用Haskell流處理庫管道來編寫命令行工具。 每個命令行操作可以將結果輸出到stdout
並使用pipes
API記錄到stderr
。
我需要Consumer
具有類型為Consumer (Either String String) mr
來打印數據塊( Left
到stderr
, Right
到stdout
)與單個Consumer
。
這個功能consumeEither
沒有靈活性所以我想改進它。
consumeEither :: (MonadIO m) => Consumer (Either String String) m ()
consumeEither = do
eitherS <- await
case eitherS of
(Left l) -> for (yield l) (liftIO . (IO.hPutStrLn IO.stderr))
(Right r) -> for (yiled r) (liftIO . putStrLn)
此外,提供一個需要兩個Consumer
並將它們合並為一個Consumer
的函數會很有用。
有沒有人知道以下界面的好例子或實現?
merge :: (Monad m) => Consumer a m r -> Consumer b m r -> Consumer (Either a b) m r
stderr
stdout
import Pipes
import qualified Pipes.Prelude as P
import qualified System.IO as IO
stdoutOrErr :: Consumer (Either String String) IO ()
stdoutOrErr = merge (P.toHandle IO.stderr) P.stdoutLn
謝謝
(這是@Michael的答案,但我想在這里寫一下,這樣我們就可以將問題移出Haskell標簽的未答復隊列。)
在管道附加中查看(+++)
。 請記住, Consumer
是一個Pipe
(無處),所以P.toHandle IO.stderr +++ P.stdoutLn :: MonadIO m => Pipe (Either String String) (Either bd) m ()
。
要獲得Consumer
,你必須擺脫Lefts
例如>-> P.concat
或>-> P.drain
。 Fold
采用更加強大而美觀的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.