在Haskell中,Iteratee based I/O似乎非常有吸引力。 Iteratees是一种可组合,安全,快速的I / O方式,受到功能语言中“折叠”a.k.a.“reduce”功能的启发。 基本上,如果你有一个遍历的想法是将遍历状态封装到一个所谓的“枚举器”中,它调用“iteratee”,而“iteratee”又是一个函数,它返回一个值或一个更多数据的请求以及一个继续要调用的枚举器。因此,只有枚举器知道遍历的状态,而迭代者知道如何处理数据并从中构建值。关于它的好处是迭代可以自动组合,其中一个迭代的输出被馈送到另一个迭代以产生更大的迭代。
所以,有两个问题:
答案 0 :(得分:8)
首先,要意识到Haskell的“懒惰IO”是一种破解,它以有限的方式打破纯度,允许I / O按需发生,因为数据被懒散地消耗。这是一种不常用的语言,懒惰的序列可以在任何地方产生同样的问题。因此,如果你正在做一些事情,例如,将一个IEnumerable
接口暴露给一个文件并在枚举序列时逐步读取它,这实际上并没有什么不同。
其次,迭代者和枚举器也可以组成所谓的(以某种笨拙的方式)枚举。此时,您可以输入顺序数据,在准备就绪时生成增量结果,并将这些结果提供给其他内容。这基本上是各种流处理器,这个概念很可能早于Haskell和C#。
第三,迭代是对抽象行为的封装,其内部工作是隐藏的。这可以说更符合OO原则,而不是ML风格的函数式编程,至少在“OO原则”的意义上,这些原则是由那些因使用getter和setter而对你大喊大叫的人所支持的,并且认为控制流应该通过多态性。
鉴于上述情况,我会说iteratee概念在C#中很适合,并且最自然地实现为IEnumerable
的倒置等价,具有组合数据流对象和“推“界面而不是标准LINQ的”拉“式。
答案 1 :(得分:8)
如果我理解你所描述的内容,那听起来很像Reactive Extensions:
http://channel9.msdn.com/Tags/reactive+extensions
Erik Meijer解释了IObservable IEnumerable在http://channel9.msdn.com/Shows/Going+Deep/Expert-to-Expert-Brian-Beckman-and-Erik-Meijer-Inside-the-NET-Reactive-Framework-Rx的数学对偶中的原因:
{{3}}