【问题标题】:Running a consumer inside a pipe在管道内运行消费者
【发布时间】:2014-09-04 17:08:00
【问题描述】:

我需要组合一个消费者和一个管道,以便消费者的输出将馈送到管道的输入。

我想这可以用这样的组合器来解决:

Consumer i m r -> (r -> Producer o m r') -> Pipe i o m r'

或者这个:

Consumer i m i' -> Pipe i' o m r -> Pipe i o m r

或类似以下的提升功能:

Consumer i m r -> Pipe i o m r

或者像这样:

Consumer i m o -> Pipe i o m r

我尝试做consumer >~ pipe 没有成功。那么如何处理呢?

【问题讨论】:

  • 您是否打算让消费者多次运行?
  • 没有。我不是故意的。

标签: haskell haskell-pipes


【解决方案1】:

对于您的第一个类型签名,如果您的ConsumerProducer 使用多态类型同义词Consumer'Producer',那么您想要的组合子是(>>=)

(>>=) :: Pipe i o m r -> (r -> Pipe i o m r') -> Pipe i o m r'

Consumer' i m r 将类型检查为Pipe i o m r。同样,Producer' o m r' 将类型检查为Pipe i o m r'

【讨论】:

    【解决方案2】:

    类似于您的签名Consumer i m o -> Pipe i o m r 的事情可以这样完成:

    {-# LANGUAGE RankNTypes #-}
    import Pipes
    
    foo :: Monad m => Consumer' i m o -> Pipe i o m ()
    foo consumer = consumer >>= yield
    

    我使用了Consumer' 多态类型同义词,因为它不是真正封闭的“下游”,它可以用作Pipe,而实际上从来没有yields。为了让它产生消费者的返回值,我们简单地使用一元绑定。

    至于您的Consumer i m r -> Pipe i o m r 签名,它只是使用多态类型同义词的身份:

    iden :: Monad m => Consumer' i m r -> Pipe i o m r
    iden consumer = consumer
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-31
      • 2023-03-20
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 2019-04-01
      • 2014-12-30
      • 1970-01-01
      相关资源
      最近更新 更多