Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# iteratee I/O在非函数式语言中有意义吗?_C#_Haskell_Iteration - Fatal编程技术网

C# iteratee I/O在非函数式语言中有意义吗?

C# iteratee I/O在非函数式语言中有意义吗?,c#,haskell,iteration,C#,Haskell,Iteration,在哈斯克尔,看起来很有吸引力。Iteratees是一种可组合、安全、快速的I/O方式,其灵感来自函数式语言中的“fold”即“reduce”函数。 基本上,如果您有一个遍历,那么想法是将遍历状态封装到一个所谓的“枚举器”中,该“枚举器”调用“迭代者”,该“迭代者”又是一个函数,返回一个值或请求更多的数据,以及枚举器要调用的延续。因此,只有枚举器知道遍历的状态,而迭代者知道如何处理数据并从中生成值。它的好处是迭代器是自动可组合的,其中一个迭代器的输出被馈送到另一个迭代器以生成更大的迭代器 因此,有

在哈斯克尔,看起来很有吸引力。Iteratees是一种可组合、安全、快速的I/O方式,其灵感来自函数式语言中的“fold”即“reduce”函数。 基本上,如果您有一个遍历,那么想法是将遍历状态封装到一个所谓的“枚举器”中,该“枚举器”调用“迭代者”,该“迭代者”又是一个函数,返回一个值或请求更多的数据,以及枚举器要调用的延续。因此,只有枚举器知道遍历的状态,而迭代者知道如何处理数据并从中生成值。它的好处是迭代器是自动可组合的,其中一个迭代器的输出被馈送到另一个迭代器以生成更大的迭代器

因此,有两个问题:

  • 这个概念在其他语言中有意义吗,比如简单的面向对象语言,还是它只对克服Haskell的懒惰I/O的缺点有用
  • 是否有其他语言的实际实现,特别是C#(因为这是我公司使用的)?(在谷歌搜索中,有一次提到了Scala中的iteratees;嗯,我现在对Scala不太感兴趣)
首先,要认识到Haskell的“懒惰IO”是一种以有限的方式破坏纯度的黑客行为,允许I/O在数据被懒惰地消耗时按需进行。在一种不纯的语言中,这是正常的,懒惰的序列可以在任何地方造成同样的问题。因此,如果您正在做一些事情,比如,将
IEnumerable
接口公开给一个文件,并在枚举序列时以增量方式读取它,这其实没有什么不同

第二,迭代器和枚举器也可以组合成所谓的枚举(有些笨拙)。在这一点上,您有一些连续数据,在它们准备好时生成增量结果,并将这些结果提供给其他内容。这基本上是一种流处理器,这个概念可能比Haskell和C#早很多

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


综上所述,我认为iteratee的概念很适合C#,最自然的实现方式是作为一种与IEnumerable相反的等价物,使用组合数据流对象和“推送”接口,而不是标准LINQ的“拉式”风格。

如果我理解您的描述,听起来很像:

Erik Meijer解释了这里的数学对偶:


这不是C#5.0中新的异步功能的基本设计目的吗?机制是不同的,但底层实现基本上是一个延续传递的实现。感谢您指出——我还不知道这一点,它看起来确实令人兴奋,所以我必须研究它,尽管我真的看不到它与迭代者有多少共同之处。;-)从我第一眼所见,我认为你是对的!谢谢,我会调查的。这是我尚未完成的实现。它显示了基本结构。有一点不同,Observer不能向observable发送消息(只能通过IDisposable取消订阅),但iteratee可以向enumerator发送消息。感谢您的精彩解释@迈克·哈特尔:值得一提的是,我已经忘记了反应式扩展;在浏览了Charles给出的链接后,很明显,它与我描述的内容是一致的。