【发布时间】:2012-05-07 21:44:10
【问题描述】:
流(惰性列表)和 monad 之间是否存在任何区别? 从概念和数学的角度,而不是从技术实现的角度。
否则,是否存在双唯一、一一对应关系?
更准确地说,作为流,它意味着来自 Scheme 语言的 SRFI-41 的“偶数流”。
它是不是 monads 之外的另一个类别?如果有,属于哪个类别?
“偶数流”可以保证对副作用的控制,比如单子?
【问题讨论】:
-
据我了解,Scheme 的流是惰性值,而 Monad 是自定义的计算链。
-
流完全是惰性列表。如何在没有 monad 或惰性列表或类似的东西的情况下呈现“惰性值”?不要将“惰性值”与不可变的函数变量混淆。那么,“自定义计算链”是否与“偶数流”一一对应?
-
好吧。比较“偶数流”和 monad 的定义。还有他们的公理。据我所知,每个流都可以通过一个单子来表达。每个单子“值”或“计算”都可以通过“偶数流”表达,这是真的吗?有什么限制吗?
-
惰性值只是延迟计算,Scheme 称之为承诺。 Monad 是以某种方式相互关联的计算(例如,它们需要是顺序的)。据我所知,这两个是不同的概念。
-
@Salil 但是什么是“延迟计算”(承诺)?在 SICP 中,据说“延迟”只是 lambda 的“语法糖”!而“力”只是平常的称呼!尽管它们的实现方式可能不同,但它们是以这种方式表达的。只是通常的价值观。尽管 monad 与“惰性值”的概念不同,但流也不同。因为它们是“惰性列表”。而且因为现在我们仍然没有定义什么是“惰性值”。延迟就是延迟,承诺就是承诺——这些是通常的价值观,而不是懒惰的。他们可能正在为懒惰构建元素,但他们自己并不懒惰。恕我直言。
标签: stream scheme monads categories lazy-evaluation