C# iteratee I/O在非函数式语言中有意义吗?
在哈斯克尔,看起来很有吸引力。Iteratees是一种可组合、安全、快速的I/O方式,其灵感来自函数式语言中的“fold”即“reduce”函数。 基本上,如果您有一个遍历,那么想法是将遍历状态封装到一个所谓的“枚举器”中,该“枚举器”调用“迭代者”,该“迭代者”又是一个函数,返回一个值或请求更多的数据,以及枚举器要调用的延续。因此,只有枚举器知道遍历的状态,而迭代者知道如何处理数据并从中生成值。它的好处是迭代器是自动可组合的,其中一个迭代器的输出被馈送到另一个迭代器以生成更大的迭代器 因此,有两个问题:C# iteratee I/O在非函数式语言中有意义吗?,c#,haskell,iteration,C#,Haskell,Iteration,在哈斯克尔,看起来很有吸引力。Iteratees是一种可组合、安全、快速的I/O方式,其灵感来自函数式语言中的“fold”即“reduce”函数。 基本上,如果您有一个遍历,那么想法是将遍历状态封装到一个所谓的“枚举器”中,该“枚举器”调用“迭代者”,该“迭代者”又是一个函数,返回一个值或请求更多的数据,以及枚举器要调用的延续。因此,只有枚举器知道遍历的状态,而迭代者知道如何处理数据并从中生成值。它的好处是迭代器是自动可组合的,其中一个迭代器的输出被馈送到另一个迭代器以生成更大的迭代器 因此,有
- 这个概念在其他语言中有意义吗,比如简单的面向对象语言,还是它只对克服Haskell的懒惰I/O的缺点有用
- 是否有其他语言的实际实现,特别是C#(因为这是我公司使用的)?(在谷歌搜索中,有一次提到了Scala中的iteratees;嗯,我现在对Scala不太感兴趣)李>
IEnumerable
接口公开给一个文件,并在枚举序列时以增量方式读取它,这其实没有什么不同
第二,迭代器和枚举器也可以组合成所谓的枚举(有些笨拙)。在这一点上,您有一些连续数据,在它们准备好时生成增量结果,并将这些结果提供给其他内容。这基本上是一种流处理器,这个概念可能比Haskell和C#早很多
第三,迭代对象是抽象行为的封装,其内部工作隐藏。这可以说更符合OO原则,而不是ML风格的函数式编程,至少在“OO原则”的意义上是这样的,这些原则是那些因为使用getter和setter而对您大喊大叫并认为控制流应该通过多态性实现的人所拥护的
综上所述,我认为iteratee的概念很适合C#,最自然的实现方式是作为一种与IEnumerable相反的等价物,使用组合数据流对象和“推送”接口,而不是标准LINQ的“拉式”风格。如果我理解您的描述,听起来很像: Erik Meijer解释了这里的数学对偶:
这不是C#5.0中新的异步功能的基本设计目的吗?机制是不同的,但底层实现基本上是一个延续传递的实现。感谢您指出——我还不知道这一点,它看起来确实令人兴奋,所以我必须研究它,尽管我真的看不到它与迭代者有多少共同之处。;-)从我第一眼所见,我认为你是对的!谢谢,我会调查的。这是我尚未完成的实现。它显示了基本结构。有一点不同,Observer不能向observable发送消息(只能通过IDisposable取消订阅),但iteratee可以向enumerator发送消息。感谢您的精彩解释@迈克·哈特尔:值得一提的是,我已经忘记了反应式扩展;在浏览了Charles给出的链接后,很明显,它与我描述的内容是一致的。