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

fir*_*dle 17 c# iteration haskell

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

那么,有两个问题:

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

C. *_*ann 8

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

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

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

鉴于上述情况,我会说iteratee概念在C#中可以很好地适用,并且最自然地实现为一种倒置等价的IEnumerable,具有组合数据流对象和"推"接口而不是标准LINQ的"拉"风格.