9

免责声明:这是最近在 haskell-cafe 列表上提出的问题。我向任何受到双重职位困扰的人道歉。

我所知道的所有迭代实现包(例如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不定义枚举组成的原因?

4

1 回答 1

2

现在有一个新版本(0.4.17),enumerator其中包括一个(=$=)带有我上面给出的签名的运算符。我给包的作者发了电子邮件,他很好地反对在包中包含许多简化的运算符(如($=)(=$)和 now (=$=))。

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

joinI :: Monad m => Iteratee a m (Step a' m b) -> Iteratee a m b

丢弃Stream a'由 inner 产生的剩余部分Iteratee。如果使用类似的样式,这不是问题

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

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

于 2012-01-02T05:04:28.197 回答