管道组库允许您在有效的流中分隔组,而无需随时将整个组保留在内存中。
管道组中的两个有用函数是folds
和foldsM
:
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 (of a( m( m r
不过,似乎不存在folds
和foldsM
的直接类似物。 (未分割流的褶皱确实存在(。
如何使用流媒体机制实现这些功能?
看起来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
应用于部分应用的fold
或foldM
以生成摘要流。
注意:我还没有尝试过。