簡體   English   中英

如何在Haskell Pipes中將兩個Consumer合並為一個?

[英]How to merge two Consumer into one in Haskell Pipes?

我使用Haskell流處理庫管道來編寫命令行工具。 每個命令行操作可以將結果輸出到stdout並使用pipes API記錄到stderr

我需要Consumer具有類型為Consumer (Either String String) mr來打印數據塊( LeftstderrRightstdout )與單個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM