2017-08-19 11 views
2

ライブラリpipes-groupライブラリを使用すると、グループ全体をいつでもメモリに保持しなくても、有効なストリームでグループを区切ることができます。ストリーミングパッケージのパイプグループから折り畳みと折り畳みを実装する方法は?

パイプ・グループからの2つの有用な機能がfoldsfoldsMある:

折り目::モナドM =>(X - > A - > X) - > X - >(X - > B) - > MX - - >(X - > MB) - > FreeT (プロデューサAM> FreeT(プロデューサー AM)MR -

foldsM ::モナドM =>( - > - > MX X)BMR>プロデューサー)mr→プロデューサbmr

achグループを区切り、結果のストリームを返します。

ファンクタパラメータとしてStream型自体を使用して、streamingパッケージalso supports delimited streams、:

ストリーム(A)Mの流れ()MRは

直接存在しないようですしかし、foldsおよびfoldsMの類似体。 (分割されていないストリームの場合は、do exist

ストリーミングの機械でこれらの機能を実装する方法

答えて

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) 

ですから、部分的サマリーのストリームを生成するfoldまたはfoldMを適用するmappedを適用することができるはず、関連提供折り目を持っています。

注意:私はこれをまだ試みていません。

関連する問題