免责声明:最近在haskell-cafe列表上询问了这个问题。我向任何被双重帖子困扰的人道歉。
我所知道的所有iteratee实现包(例如iteratee
,iterIO
和conduit
)定义了枚举组合函数,但enumerator
包除外。在我看来,这似乎是一个严重的限制,但实施它似乎也相对简单:
import Data.Enumerator
import Data.Enumerator.Internal
(=$=) :: Monad m
=> Enumeratee a0 a1 m (Step a2 m b) -> Enumeratee a1 a2 m b
-> Enumeratee a0 a2 m b
(=$=) e01 e12 step = Iteratee $ do
step' <- runIteratee $ e12 step
runIteratee . joinI $ e01 step'
我在这里有些遗失吗?或者enumerator
没有定义枚举组合的其他原因?
答案 0 :(得分:2)
现在有enumerator
的新版本(0.4.17),其中包含(=$=)
运算符,其中包含我上面给出的签名。我通过电子邮件发送了该软件包的作者,他提出了一个很好的理由,反对在软件包中包含许多简化的运算符(如($=)
,(=$)
和现在(=$=)
)。
基本上,问题在于处理剩余输入。 joinI
组合子
joinI :: Monad m => Iteratee a m (Step a' m b) -> Iteratee a m b
丢弃内部Stream a'
产生的遗留Iteratee
。如果使用类似
joinI (foo $$ (bar $$ baz))
其中剩余数据仅在计算结束时被丢弃。但是,使用简化的运算符会导致多个隐式连接,并且剩余数据变得更难以跟踪。如果使用的迭代很简单(即它们不会产生剩余数据),那么这不是问题,简化的运算符使用是有意义的。