Haskell Streams(Comonadic):无限?

时间:2017-06-06 13:08:25

标签: haskell stream lazy-evaluation infinite

我看过使用的流作为comonad的默认示例,但我无法确定它们是如何无限的,但不是。

假设我们有数据构造函数(from here

data Stream a = a :> Stream a

我们如何最终完成一个流?我们在最后写了一个未定义的吗?我知道这种语言是懒惰的,但某些地方必须削减,对吧?我错了吗?

1 个答案:

答案 0 :(得分:6)

流本质上是无限的;你不能创建一个有限的流。比较StreamList

data List   a = Empty | a :  List a
data Stream a =         a :> Stream a

由于Empty构造函数,您可以创建有限列表;可以创建List值而无需引用另一个List值。另一方面,Stream值可以使用另一个 Stream值创建Stream上进行模式匹配的任何时间,您会获得a类型的值和另一个Stream值。

“整理”流只是意味着您停止从中提取值,而不是您到达流的“结束”。

实际上,这意味着您无法在内存中实例化完整的流;您只能按需构建它,通常通过在:>构造函数上进行模式匹配时调用函数来生成剩余的流。