理解'剩余的'从管道

时间:2017-11-24 20:45:43

标签: haskell conduit

为什么以下输出[]

λ: >runConduitPure $ yieldMany [1..2] .| leftover 5 .| sinkList
[]

我天真地期望它返回:[1,2,5]leftover个文档:

  

提供当前monadic绑定中下一个组件使用的单个剩余输入。

1 个答案:

答案 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列出这两个值。