在枚举器中编写枚举

Mik*_*aig 9 haskell enumerator

免责声明:最近在haskell-cafe列表上询问了这个问题.我向任何被双重打扰的人道歉.

所有iteratee-实现包,我知道的(例如iteratee,iterIOconduit)定义一个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不定义枚举组成的原因?

Mik*_*aig 2

现在有一个新版本(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)

其中剩余数据仅在计算结束时被丢弃。然而,使用简化的运算符会导致多个隐式连接,并且剩余数据变得更难以跟踪。如果使用的迭代器很简单(即它们不会产生剩余数据),那么这不是问题,并且使用简化的运算符是有意义的。