gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:01:10 24 4
gpt4 key购买 nike

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

那么,两个问题:

  • 这个概念在其他语言中是否有意义,比如普通的面向对象语言,或者它是否只对克服 Haskell 惰性 I/O 的缺点有用?
  • 是否有任何其他语言的实际实现,尤其是 C#(我公司使用的是 C#)? (谷歌搜索在 Scala 中提到了一个迭代器;好吧,我现在对 Scala 不那么感兴趣)。

最佳答案

首先,要意识到 Haskell 的“Lazy IO”是一种 hack,它以有限的方式打破纯度,允许 I/O 在数据被惰性消费时按需发生。这在不纯的语言中很常见,惰性序列可以在任何地方产生同样的问题。因此,如果您正在做一些事情,比如说,将 IEnumerable 接口(interface)公开给文件并在枚举序列时增量读取它,这实际上并没有什么不同。

其次,iteratees 和 enumerators 也可以组合成所谓的(以有点笨拙的方式)enumeratees。在这一点上,你有一些东西被提供顺序数据,在它们准备好时产生增量结果,并将这些结果提供给其他东西。这基本上是流处理器的变体,这个概念可能比 Haskell 和 C# 早了相当长的时间。

第三,iteratees 是抽象行为的封装,隐藏了它们的内部工作原理。与 ML 风格的函数式编程相比,这可以说更符合 OO 原则,至少在“OO 原则”的意义上是这样,这些人因使用 getter 和 setter 而对你大吼大叫,并认为控制流应该通过以下方式实现多态性。

鉴于上述情况,我认为迭代器概念在 C# 中非常合适,并且最自然地实现为 IEnumerable 的一种倒置等价物,具有组合数据流对象和“推”接口(interface),而不是标准 LINQ 的“拉”风格。

关于c# - iteratee I/O 在非函数式语言中有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6795384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com