Streams vs monads

时间:2012-05-07 21:44:10

标签: stream scheme monads categories lazy-evaluation

流(懒惰列表)和monad之间是否存在任何差异? 从概念和数学的角度来看,而不是从技术实施。

否则,确实存在biunique,一对一的对应关系?

更准确地说,作为流,它意味着来自Scheme语言的SRFI-41的“偶数流”。

它是另一个类别而不是monads吗?如果是这样,那是什么类别?

愿“偶数流”保证控制副作用,比如monads?

1 个答案:

答案 0 :(得分:5)

正如Salil所说,这两者是不同的概念:

是(可能是无限的)值列表,通常但不一定以惰性方式计算,即,仅存储在请求时计算值的某种方式。有很多例子不涉及monad:

(define integers (cons-stream 1 (stream-map (lambda (x) (+ x 1)) integers))

将有限的,预先计算的列表视为流是非常有用的,因为您可以在任何地方(可能或必然)使用有限的惰性流来使用它们。

因此,一个流有一个操作next: streamType -> (valueType streamType)来获取下一个值和剩余的流。

另一方面,

Monads,不是一种数据结构,而是通过组合各个命令来编写源代码的方法。

可能最简单有用的例子是“Maybe monad” - 我不确定它在Scheme中的样子,对不起,但想法是:给出一个计算列表(f g h)和一个输入{{ 1}},按顺序执行计算,几乎就像给定x一样,但让每个函数优雅地失败:如果(f (g (h x)))返回g,则不要调用nil,但是,请立即返回(f nil)

当然,您可以通过各种有用的方式将两者结合起来,并使用monad计算流值,或封装I / O流等流的使用,这些流不完全符合monad中函数式编程的期望(以避免代码存储对流的某些先前状态的引用),但它们用于完全不同的目的。想想抽象层(关闭封面,不要看内部):应用于函数的monad为您提供了一个函数。另一方面,流不是一些更高的功能,而是一个值列表。

显然,monad定义的函数(或根据你的观点返回的)monad可以是流的实现,并且从流中提取的值也可以是monad。但正如您在上面所看到的,有些monad实现了与流完全不同的东西。是否存在未实现为monad的流可能取决于您使用该术语的具体内容。我必须承认,我现在不确定无限的流是否恰当符合monad;有限列表显然可以。