Haskell Streams(Comonadic):无限?

Jac*_*ndt 1 haskell stream infinite lazy-evaluation

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

假设我们有数据构造函数(从这里)

data Stream a = a :> Stream a
Run Code Online (Sandbox Code Playgroud)

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

che*_*ner 6

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

data List   a = Empty | a :  List a
data Stream a =         a :> Stream a
Run Code Online (Sandbox Code Playgroud)

您可以根据Empty构造函数创建有限列表; 可以在List不引用其他List值的情况下创建值.甲Stream值,而另一方面,可以通过使用创建的另一个 Stream值.无论何时在a上进行模式匹配Stream,都会得到type a和另一个Stream值的值.

"完成"流只是意味着您停止从中提取值,而不是您到达流的"结束".

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

  • 虽然从表面上看是完全合理的,但最后一段(关于"实例化内存中的完整流")在操作上是不正确的 - 这正是打结给你的!例如,给定定义`ones = 1:> ones`,流将由单个"cons"单元表示,指针返回自身(一旦thunk消失). (3认同)
  • 一个更现实的场景是用户按下的键流:你把它视为一个无限的流,因为从来没有一个已知是最后一个的按键(现在忽略ctrl-D).终止在程序结束时发生,而不是在流结束时发生. (2认同)