【问题标题】:Composing Enumeratees in Enumerator在枚举器中组合枚举器
【发布时间】:2011-12-29 23:41:15
【问题描述】:

免责声明:这是最近在 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 不定义枚举组合的其他原因?

【问题讨论】:

  • 我已通过电子邮件向the enumerator package 的作者/维护者 John Millikin 发送电子邮件,将他与此问题相关联。

标签: haskell enumerator


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2020-05-19
    • 2011-04-09
    相关资源
    最近更新 更多