Streams vs monads

cof*_*ofp 14 monads scheme stream lazy-evaluation categories

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

或者,确实存在biunique,一对一之间的对应关系?

更确切地说,作为流,它意味着来自Scheme语言的SRFI-41的"偶数流" .

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

可能"甚至溪流"保证控制副作用,如monads?

Chr*_*zig 5

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

是值的(可能是无限的)列表中,典型地,但不是必须地,在计算惰性方式,即,仅存储在请求时计算的值的某种方式.有很多例子不涉及monad:

(define integers (cons-stream 1 (stream-map (lambda (x) (+ x 1)) integers))
Run Code Online (Sandbox Code Playgroud)

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

因此,流是具有next: streamType -> (valueType streamType)获取下一个值和剩余流的操作的东西.

 

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

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

 

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

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