在枚举器中编写枚举

时间:2011-12-29 23:41:16

标签: haskell enumerator

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

我所知道的所有iteratee实现包(例如iterateeiterIOconduit)定义了枚举组合函数,但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没有定义枚举组合的其他原因?

1 个答案:

答案 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))

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