[英]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.