[英]Understanding 'leftover' from conduit
為什么以下輸出[]
?
λ: >runConduitPure $ yieldMany [1..2] .| leftover 5 .| sinkList
[]
我天真地希望它返回: [1,2,5]
每個剩余文檔:
提供單個剩余輸入供當前單子綁定中的下一個組件使用。
我們必須區分>>=
和.|
的Conduit
的組成.|
。
使用>>=
,我們對兩個共享公共輸入和公共輸出流的Conduit
的動作進行排序。
用.|
,我們將一個Conduit
的輸出流連接到另一個Conduit
的輸入流。
leftover
函數將一個值壓入當前Conduit
的輸入流的當前位置,使其可用於連接到相同輸入流(帶有>>=
)的其他Conduit
動作。 它不會在當前Conduit
的輸出流中yield
任何結果,這就是為什么sinkList
在您的示例中生成空列表的原因。
如果要查看leftover
的效果,則必須執行sinkList
,在這里它可以訪問與leftover
的相同輸入流:
runConduitPure $ yieldMany [1..2] .| (leftover 5 >> sinkList)
產生[5, 1, 2]
(不是[1, 2, 5]
leftover
[1, 2, 5]
),因為leftover
的1
和2
被消耗之前,將5
推入輸入流。
如果我們在leftover
之前添加一個await
:
runConduitPure $ yieldMany [1..2] .| (await >> leftover 5 >> sinkList)
那么我們得到[5, 2]
因為我們在做leftover
之前消耗(並丟棄) 1
。
我們還可以從leftover
Conduit
yield
,這會將一個值推入輸出流,以供另一個由組成的Conduit
使用.|
:
runConduitPure $ yieldMany [1..2] .| myLeftoverConduit .| sinkList where
myLeftoverConduit = do
leftover 5
l <- sinkList
yield l
yield [42]
產生[[5, 1, 2], [42]]
sinkList
[[5, 1, 2], [42]]
因為我們將sinkList
(一個列表)的結果yield
ed,然后yield
ed [42]
(也是一個列表)。 然后,下游sinkList
列出這兩個值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.