我看过使用的流作为comonad的默认示例,但我无法确定它们是如何无限的,但不是。
假设我们有数据构造函数(from here)
data Stream a = a :> Stream a
我们如何最终完成一个流?我们在最后写了一个未定义的吗?我知道这种语言是懒惰的,但某些地方必须削减,对吧?我错了吗?
答案 0 :(得分:6)
流本质上是无限的;你不能创建一个有限的流。比较Stream
和List
:
data List a = Empty | a : List a
data Stream a = a :> Stream a
由于Empty
构造函数,您可以创建有限列表;可以创建List
值而无需引用另一个List
值。另一方面,Stream
值可以仅使用另一个 Stream
值创建。 在Stream
上进行模式匹配的任何时间,您会获得a
类型的值和另一个Stream
值。
“整理”流只是意味着您停止从中提取值,而不是您到达流的“结束”。
实际上,这意味着您无法在内存中实例化完整的流;您只能按需构建它,通常通过在:>
构造函数上进行模式匹配时调用函数来生成剩余的流。