2017-11-24 10 views
0

なぜ次の出力は[]ですか?コンジットからの「残存」の理解

λ: >runConduitPure $ yieldMany [1..2] .| leftover 5 .| sinkList 
[] 

私は単純にそれを返すことが期待:leftover年代ドキュメントあたり[1,2,5]

結合現在モナド内の次のコンポーネントによって消費される残りの入力の単一片を提供します。

答えて

4

我々は>>=Conduit秒の組成物との間の区別をし、そして.|を持つ必要があります。

>>=では、共通の入力ストリームと共通の出力ストリームを共有する2つのアクションをシーケンシングしています。

.|では、の出力ストリームを別のストリームの入力ストリームに接続しています。

leftover関数は(>>=と)同じ入力ストリームに接続された他のConduitアクションが利用できるように、現在のConduitの入力ストリームの現在位置に値をプッシュします。現在のConduitの出力ストリームには何もないyieldなので、sinkListがあなたの例で空のリストを生成する理由です。

あなたがleftoverの効果を確認したい場合、あなたはそれがleftoverと同じ入力ストリームにアクセスすることができsinkListを実行する必要があります。

runConduitPure $ yieldMany [1..2] .| (leftover 5 >> sinkList) 

これは[5, 1, 2](ない[1, 2, 5])を生成し、leftover押すため12の前の入力ストリームへの5が消費されました。 leftoverを行う前に

runConduitPure $ yieldMany [1..2] .| (await >> leftover 5 >> sinkList) 

を我々は消費(および破棄)ので、我々は[5, 2]を得る1

我々はleftoverawaitを追加した場合。

我々は可能性もyield.|で構成別Conduitによって消費される出力ストリームに値をプッシュします私たちのleftoverConduit、から:我々yieldsinkListの結果を編ため

runConduitPure $ yieldMany [1..2] .| myLeftoverConduit .| sinkList where 
    myLeftoverConduit = do 
    leftover 5 
    l <- sinkList 
    yield l 
    yield [42] 

は([[5, 1, 2], [42]]を生成リスト)、yield ed [42](これもリスト)。下流のsinkListは、これらの2つの値のリストを作成します。

関連する問題