簡體   English   中英

了解管道中的“剩余”

[英]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] ),因為leftover12被消耗之前,將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM