渴望与懒惰的哈斯克尔。在Eager语言中可以列出无限列表?

时间:2011-12-30 04:27:21

标签: haskell lazy-evaluation infinite eager

显然,可以实现Haskell,使其在不改变语言语义的情况下急切地进行评估。如果这是真的,那么如何处理无限数据结构呢?

http://csg.csail.mit.edu/pubs/haskell.html

  

因此,花费大量时间来创建和销毁暂停的计算(thunk)。通常,这些计算非常简单,因此很容易对它们进行评估。 Faxen和其他人已经使用静态分析来揭示这种渴望的机会。相反,我们建议在任何地方使用热情,同时使用允许我们恢复的机制,如果我们的计划过于热切。

关键是“如果我们的计划过于热切,我们就有机制可以恢复”。这些机制是什么?他们如何允许无限的数据结构和懒惰评估的其他方面,我已经被认为是不可能用热切的语言?

1 个答案:

答案 0 :(得分:11)

这不完全正确:如果你能证明他们不会分歧,你可以急切地评估Haskell术语

例如,当您看到f x时,您可以首先执行多达1,000步 x (如果您达到WHNF(弱头正常形式)或错误则停止),以及然后将其传递给 f - 语义被保留,但是如果你认为 x 将被评估,那么你可以提前安排这个作为优化

如果是x = fix id,它只会在1000步之后放弃,不会去任何地方。如果x = undefined,则会导致错误并放弃(恢复原始thunk并将其传递给 f )。等等。

如果x = [1..],则可能最终将其缩减为1 : 2 : 3 : ... : 999 : 1000 : [1001..],达到限制,然后停在那里,将结果传递给 f

基本上:通过证明表达式不能发散,或者限制评估,以便即使它发生也会终止。没有改变语义,也可能是对性能的重大改进。

当然,缺点是,如果 x 是一些非常昂贵的计算, f 只使用了一半,你将花费1,000个减少步骤浪费时间。在[1..]的情况下,最终可能会使用大量内存来存储列表;如果 f 一次处理一个元素列表,每次都丢掉头部,那么你就会浪费内存。这就是为什么它很棘手:))

您最初链接的页面详细介绍了所使用的具体技术。