iteratee I / O在非功能语言中是否有意义?

时间:2011-07-22 19:56:51

标签: c# haskell iteration

在Haskell中,Iteratee based I/O似乎非常有吸引力。 Iteratees是一种可组合,安全,快速的I / O方式,受到功能语言中“折叠”a.k.a.“reduce”功能的启发。 基本上,如果你有一个遍历的想法是将遍历状态封装到一个所谓的“枚举器”中,它调用“iteratee”,而“iteratee”又是一个函数,它返回一个值或一个更多数据的请求以及一个继续要调用的枚举器。因此,只有枚举器知道遍历的状态,而迭代者知道如何处理数据并从中构建值。关于它的好处是迭代可以自动组合,其中一个迭代的输出被馈送到另一个迭代以产生更大的迭代。

所以,有两个问题:

  • 这个概念是否甚至可以用于其他语言,例如普通的面向对象语言,还是仅仅用于克服Haskell懒惰I / O的缺点?
  • 是否有其他语言的实际实现,特别是C#(因为这是我公司使用的)? (谷歌搜索在Scala中提到了一个iteratees;好吧,我现在对Scala不感兴趣)。

2 个答案:

答案 0 :(得分:8)

首先,要意识到Haskell的“懒惰IO”是一种破解,它以有限的方式打破纯度,允许I / O按需发生,因为数据被懒散地消耗。这是一种不常用的语言,懒惰的序列可以在任何地方产生同样的问题。因此,如果你正在做一些事情,例如,将一个IEnumerable接口暴露给一个文件并在枚举序列时逐步读取它,这实际上并没有什么不同。

其次,迭代者和枚举器也可以组成所谓的(以某种笨拙的方式)枚举。此时,您可以输入顺序数据,在准备就绪时生成增量结果,并将这些结果提供给其他内容。这基本上是各种流处理器,这个概念很可能早于Haskell和C#。

第三,迭代是对抽象行为的封装,其内部工作是隐藏的。这可以说更符合OO原则,而不是ML风格的函数式编程,至少在“OO原则”的意义上,这些原则是由那些因使用getter和setter而对你大喊大叫的人所支持的,并且认为控制流应该通过多态性。

鉴于上述情况,我会说iteratee概念在C#中很适合,并且最自然地实现为IEnumerable的倒置等价,具有组合数据流对象和“推“界面而不是标准LINQ的”拉“式。

答案 1 :(得分:8)