5

显然,可以实现 Haskell 以便它热切地评估而不改变语言的语义。如果这是真的,那么如何处理无限数据结构?

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

因此,大量时间用于创建和销毁暂停的计算(thunk)。很多时候,这些计算非常简单,以至于评估它们同样容易。Faxen 和其他人已经使用静态分析来揭示这种渴望的机会。相反,我们建议在任何地方都使用渴望,同时使用允许我们在程序过于渴望时恢复的机制。

关键是“如果我们的程序过于急切,我们有恢复机制”。这些机制是什么?它们如何允许无限的数据结构和我一直相信的惰性求值的其他方面在热切的语言中是不可能的?

4

1 回答 1

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一次处理列表一个元素,每次都扔掉头部,那么你会浪费内存。这就是为什么它很棘手:)

您最初链接的页面更详细地介绍了所使用的特定技术。

于 2011-12-30T04:33:30.337 回答