为什么以下输出[]
?
λ: >runConduitPure $ yieldMany [1..2] .| leftover 5 .| sinkList
[]
我天真地期望它返回:[1,2,5]
每leftover个文档:
提供当前monadic绑定中下一个组件使用的单个剩余输入。
答案 0 :(得分:4)
我们必须区分beforeEach(function(done) {
//here we setup the "spy"
spyOn(window, 'updateChars');
//supose this is a promise and we can call .then
loadFixtures('Fixture.html')
.then(function(){
txt = $('#text');
remainingChar = $('#count');
maxLengthBox = txt.attr('maxLength');
remainingChar.html(maxLengthBox);
done(); //finally
});
});
it("checking remaining characters", function(done) {
txt.val('hello');
txt.trigger('keyup');
expect(updateChars).toHaveBeenCalled():
done();
});
与Conduit
和>>=
的构成。
使用.|
,我们对两个共享公共输入和公共输出流的>>=
的操作进行排序。
使用Conduit
,我们将一个.|
的输出流连接到另一个的输入流。
Conduit
函数将值推送到当前leftover
输入流的当前位置,使其可用于连接到同一输入流的其他Conduit
操作(使用{ {1}})。它不会Conduit
当前>>=
的输出流中的任何内容,这就是yield
在您的示例中生成空列表的原因。
如果您想查看Conduit
的效果,则必须执行sinkList
,它可以访问与leftover
相同的输入流:
sinkList
这会产生leftover
(不是runConduitPure $ yieldMany [1..2] .| (leftover 5 >> sinkList)
),因为[5, 1, 2]
会将[1, 2, 5]
推送到leftover
之前的输入流,5
已被消耗。
如果我们在1
之前添加2
:
await
然后我们得到leftover
因为我们在执行runConduitPure $ yieldMany [1..2] .| (await >> leftover 5 >> sinkList)
之前消费(并丢弃)[5, 2]
。
我们还可以1
leftover
yield
,它会将值推送到输出流中,由leftover
组成的另一个Conduit
使用:
Conduit
生成.|
,因为我们runConduitPure $ yieldMany [1..2] .| myLeftoverConduit .| sinkList where
myLeftoverConduit = do
leftover 5
l <- sinkList
yield l
yield [42]
编辑了[[5, 1, 2], [42]]
(列表)的结果,然后yield
编辑sinkList
(也是列表)。然后下游yield
列出这两个值。