gpt4 book ai didi

haskell - 如何在 Haskell Pipes 中将两个 Consumer 合并为一个?

转载 作者:行者123 更新时间:2023-12-02 22:00:52 25 4
gpt4 key购买 nike

我使用Haskell流处理库pipes编写一个命令行工具。每个命令行操作都可以使用 pipes API 将结果输出到 stdout 并记录到 stderr

我需要类型为 Consumer (Either String String) m rConsumer 来打印数据 block (Leftstderr Rightstdout),具有单个 Consumer

我写的代码(应该改进)

这个函数 consumeEither 没有灵 active ,所以我想改进它。

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 的函数会很有用。

问题

有人知道以下接口(interface)的好的示例或实现吗?

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 标签的未回答队列中移出。)

参见pipes-extras中的(+++) 。请记住 Consumer 是一个 Pipe (无处可去),因此 P.toHandle IO.stderr+++ P.stdoutLn::MonadIO m => Pipe (要么字符串字符串)(要么b d)m()

要获得 Consumer,您必须摆脱 Lefts,例如使用 >-> P.concat >>-> P.drain。使用 Fold 有更强大、更美观的方法来做到这一点。

关于haskell - 如何在 Haskell Pipes 中将两个 Consumer 合并为一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29932852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com