如何实现流媒体包的管道组折叠和折叠?

时间:2017-08-19 15:23:31

标签: haskell streaming

pipes-group库允许您在有效流中划分组,而无需随时在内存中保存整个组。

来自管道组的两个有用功能是foldsfoldsM

  

folds :: Monad m => (x - > a - > x) - > x - > (x - > b) - > FreeT(制片人   a m)m r - >制片人b m r

     

foldsM :: Monad m => (x - > - a - > m x) - > m x - > (x - > m b) - >游离T%   (制片人a m)m r - >制片人b m r

他们在分隔的流中汇总每个组并返回结果流。

streamingalso supports delimited streams,使用Stream类型本身作为仿函数参数:

  

流(流(Of a)m)m r

尽管似乎没有foldsfoldsM的直接类似物。  (折叠为未划分的溪流do exist)。

如何使用流媒体的机制实现这些功能?

1 个答案:

答案 0 :(得分:2)

看起来Streaming.mapped是关键工具。

mapped :: (Monad m, Functor f)
       => (forall x. f x -> m (g x)) 
       -> Stream f m r
       -> Stream g m r

mapped :: (Monad m, Functor f)
       => (forall x. Stream f m x -> m (g x))
       -> Stream (Stream f m) m r
       -> Stream g m r

mapped :: Monad m
       => (forall x. Stream (Of a) m x -> m (Of b x))
       -> Stream (Stream (Of a) m) m r
       -> Stream (Of b) m r

我们还提供相关的折叠,

fold :: Monad m
     => (x -> a -> x) -> x -> (x -> b)
     -> Stream (Of a) m r -> m (Of b r)

foldM :: Monad m
      => (x -> a -> m x) -> m x -> (x -> m b)
      -> Stream (Of a) m r -> m (Of b r)

因此,您应该可以将mapped应用于部分应用的foldfoldM,以生成摘要流。

警告:我还没有尝试过这个。