なぜ次の出力は[]
ですか?コンジットからの「残存」の理解
λ: >runConduitPure $ yieldMany [1..2] .| leftover 5 .| sinkList
[]
私は単純にそれを返すことが期待:leftover年代ドキュメントあたり[1,2,5]
:
結合現在モナド内の次のコンポーネントによって消費される残りの入力の単一片を提供します。
なぜ次の出力は[]
ですか?コンジットからの「残存」の理解
λ: >runConduitPure $ yieldMany [1..2] .| leftover 5 .| sinkList
[]
私は単純にそれを返すことが期待:leftover年代ドキュメントあたり[1,2,5]
:
結合現在モナド内の次のコンポーネントによって消費される残りの入力の単一片を提供します。
我々は>>=
と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
押すため1
と2
の前の入力ストリームへの5
が消費されました。 leftover
を行う前に
runConduitPure $ yieldMany [1..2] .| (await >> leftover 5 >> sinkList)
を我々は消費(および破棄)ので、我々は[5, 2]
を得る1
:
我々はleftover
前await
を追加した場合。
我々は可能性もyield
.|
で構成別Conduit
によって消費される出力ストリームに値をプッシュします私たちのleftover
Conduit
、から:我々yield
はsinkList
の結果を編ため
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つの値のリストを作成します。