Jac*_*ndt 1 haskell stream infinite lazy-evaluation
我已经看到使用流作为comonad的默认示例,但我无法确定它们是如何无限的,但不是.
假设我们有数据构造函数(从这里)
data Stream a = a :> Stream a
Run Code Online (Sandbox Code Playgroud)
我们如何最终完成一个流?我们在最后写了一个未定义的吗?我知道这种语言是懒惰的,但某些地方必须削减,对吧?我错了吗?
流本质上是无限的; 你不能创建一个有限的流.比较Stream和List:
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值的值.
"完成"流只是意味着您停止从中提取值,而不是您到达流的"结束".
实际上,这意味着您无法在内存中实例化完整的流; 您只能按需构建它,通常通过在:>构造函数上进行模式匹配时调用函数来生成流的其余部分.
| 归档时间: |
|
| 查看次数: |
196 次 |
| 最近记录: |