繁体   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