【发布时间】:2016-12-15 17:20:16
【问题描述】:
我正在使用 Conduit 以类似流的方式解析一些数据。在流中的某个时刻,我需要每 12 个元素。有没有方便的方法来做到这一点?
我目前明确地等待 12 个元素返回第一个元素:
get12th :: Monad m => Conduit Int m Int
get12th = loop
where
loop = do
v1 <- await
_ <- await
_ <- await
_ <- await
_ <- await
_ <- await
_ <- await
_ <- await
_ <- await
_ <- await
_ <- await
_ <- await
case v1 of
Nothing -> return ()
Just x -> do
yield x >> loop
它确实有效,但我想知道这是否是最好的方法。
【问题讨论】:
-
此外,在交付当前元素之前,您最终会等待更多元素(
v1 <- await在底部会更好 - 您的蹦床调用可以处理您应该以 @987654323 开头的事实@) -
@Alec 我明白你在说什么,我有一个解决方案。但是,我看不出将
v1 <- await移到底部如何解决问题。 -
在这里,您在发送下一个元素之前等待额外的 11 个元素(您之前收到了 11 个元素!)。移动
v1 <- await,一拿到v1就会发送。 -
@Alec 我仍然不明白移动
v1 <- await是如何解决问题的。在你得到v1并让步之前,做任何事情都是没有意义的。这就是我现在等待v1的原因。一旦我得到它,我立即让出它,等待另外 11 个值,然后再次循环。但这并不重要,因为这似乎会增加合理的性能损失。 -
@ThomasVanhelden 别担心;您对启发您的解决方案的 cmets 给予了应有的评价,因此没有人会因此而嫉妒您。