Haskell 如何从管道组为流媒体包实现折叠和折叠DSM?

Haskell 如何从管道组为流媒体包实现折叠和折叠DSM?,haskell,streaming,Haskell,Streaming,该库允许您在有效流中分隔组,而无需在任何时候将整个组保存在内存中 管道组中的两个有用功能是和: 折叠:单子m=>(x->a->x)->x->(x->b)->FreeT(制作人) a m)m r->Producer b m r foldsM::Monad m=>(x->a->m x)->m x->(x->m b)->FreeT (制作人a m)m r->制作人b m r 它们汇总分隔流中的每个组,并返回结果流 包,通过使用流键入自身作为functor参数: 溪流(a的溪流)m r 然而,似乎不存在

该库允许您在有效流中分隔组,而无需在任何时候将整个组保存在内存中

管道组中的两个有用功能是和:

折叠:单子m=>(x->a->x)->x->(x->b)->FreeT(制作人) a m)m r->Producer b m r

foldsM::Monad m=>(x->a->m x)->m x->(x->m b)->FreeT (制作人a m)m r->制作人b m r

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

包,通过使用
键入自身作为functor参数:

溪流(a的溪流)m r

然而,似乎不存在与
folds
foldsM
的直接类似物。 (不分割溪流的褶皱)


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

看起来像是
流媒体。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
以生成一系列摘要

注意:我尚未尝试此操作