Haskell 在枚举器中组合枚举

Haskell 在枚举器中组合枚举,haskell,enumerator,Haskell,Enumerator,免责声明:这是最近在haskell咖啡馆列表中提出的问题。我向任何被这双重邮件打扰的人道歉 我所知道的所有迭代器实现包(例如,iteratee、iterIO和conductor)都定义了枚举组合函数,除了枚举器包。在我看来,这似乎是一个严重的限制,但实施起来似乎也相对简单: import Data.Enumerator import Data.Enumerator.Internal (=$=) :: Monad m => Enumeratee a0 a1 m (Step a2

免责声明:这是最近在haskell咖啡馆列表中提出的问题。我向任何被这双重邮件打扰的人道歉

我所知道的所有迭代器实现包(例如,
iteratee
iterIO
conductor
)都定义了枚举组合函数,除了
枚举器
包。在我看来,这似乎是一个严重的限制,但实施起来似乎也相对简单:

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'
导入数据。枚举器
导入Data.Enumerator.Internal
(=$=)::单子m
=>枚举a0 a1 m(步骤a2 m b)->枚举a1 a2 m b
->枚举a0 a2 m b
(=$=)e01 e12步骤=迭代对象$do
步骤'现在有一个新版本(0.4.17)的
枚举器
,它包括一个
(=$=)
操作符,上面有我给出的签名。我给软件包的作者发了电子邮件,他提出了一个很好的理由,反对在软件包中包含许多简化运算符(如
($=)
(=$)
,现在是
(=$=)

基本上,问题在于处理剩余输入。
joinI
组合器

joinI :: Monad m => Iteratee a m (Step a' m b) -> Iteratee a m b
丢弃内部
迭代对象生成的剩余
流a'
。如果使用类似的样式,这不是问题

joinI (foo $$ (bar $$ baz))

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

我已经给的作者/维护者John Millikin发了电子邮件,将他与这个问题联系起来。