流(惰性列表(和monads之间有什么区别吗?从概念和数学的角度来看,而不是从技术实现的角度来看。
否则,是否存在双唯一、一对一的对应关系?
更确切地说,作为流,它意味着来自 Scheme 语言的 SRFI-41 的"偶数流"。
它是莫纳德之外的另一个类别吗?如果是这样,它是什么类别?
"均匀流"可以保证控制副作用,如单胞菌吗?
正如Salil已经说过的,两者是不同的概念:
流是一个(可能是无限的(值列表,通常(但不一定(以延迟方式计算,即仅在请求时存储某种计算值的方法。周围有很多例子不以任何方式涉及monads:
(define integers (cons-stream 1 (stream-map (lambda (x) (+ x 1)) integers))
将有限的、预先计算的列表视为流也非常有用,因为您可以在任何可以使用(潜在或必然(有限延迟流的地方使用它们。
因此,流是具有操作next: streamType -> (valueType streamType)
以获取下一个值和剩余流的东西。
另一方面,Monads 与其说是一种数据结构,不如说是一种通过组合各个命令来编写源代码的方式。
可能最简单的有用示例是"也许 monad"——我不确定它在 Scheme 中会是什么样子,对不起,但这个想法是:给定一个计算(f g h)
列表和一个输入x
,按顺序执行计算,几乎就像给定(f (g (h x)))
一样,但让每个函数优雅地失败: 如果g
返回nil
, 不要调用(f nil)
,而是立即返回nil
。
当然,你可以以各种有用的方式将两者结合起来,并使用 monads 计算流值,或者封装像 I/O 流这样的流的使用,这些流不完全遵循 monad 中函数式编程的期望(以避免代码存储对流的某些先前状态的引用(,但它们用于完全不同的目的。想想抽象层(合上封面,不要看内脏(:应用于函数的monad给你一个函数。另一方面,流不是某个高级函数,而是值列表。
显然,由 monad 定义(或返回,具体取决于您的观点(的函数可以是流的实现,而且,从流中提取的值可以是 monads。但正如你在上面看到的,有一些 monads 实现的东西与流完全不同。是否存在未实现为 monads 的流可能取决于您使用该术语的确切用途。我必须承认,我现在不确定无限流是否有资格作为 monads;有限列表显然可以。