Mik*_*aig 9 haskell enumerator
免责声明:最近在haskell-cafe列表上询问了这个问题.我向任何被双重打扰的人道歉.
所有iteratee-实现包,我知道的(例如iteratee,iterIO和conduit)定义一个enumeratee组合物功能,除了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'
Run Code Online (Sandbox Code Playgroud)
这里有一些我想念的东西吗?或者其他一些enumerator不定义枚举组成的原因?
现在有一个新版本(0.4.17),其中enumerator包含一个(=$=)具有我上面给出的签名的操作员。我给包的作者发了电子邮件,他很好地反对在包中包含许多简化的运算符(例如($=)、(=$)和 now )。(=$=)
基本上,问题在于处理剩余输入。组合joinI器
joinI :: Monad m => Iteratee a m (Step a' m b) -> Iteratee a m b
Run Code Online (Sandbox Code Playgroud)
Stream a'丢弃内部 产生的剩余部分Iteratee。如果使用像这样的样式,这不是问题
joinI (foo $$ (bar $$ baz))
Run Code Online (Sandbox Code Playgroud)
其中剩余数据仅在计算结束时被丢弃。然而,使用简化的运算符会导致多个隐式连接,并且剩余数据变得更难以跟踪。如果使用的迭代器很简单(即它们不会产生剩余数据),那么这不是问题,并且使用简化的运算符是有意义的。