如何从流包的管道组实现折叠和折叠M?

  • 本文关键字:折叠 实现 管道 haskell streaming
  • 更新时间 :
  • 英文 :


管道组库允许您在有效的流中分隔组,而无需随时将整个组保留在内存中。

管道组中的两个有用函数是foldsfoldsM

折叠 :: 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( -> FreeT (制片人 a m( m r -> 制片人 b m r

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

流式处理包还支持分隔流,方法是使用Stream类型本身作为函子参数:

Stream (

Stream (of a( m( m r

不过,似乎不存在foldsfoldsM的直接类似物。 (未分割流的褶皱确实存在(。

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

看起来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以生成摘要流。

注意:我还没有尝试过。

最新更新