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

The*_*kle 5 haskell eager infinite lazy-evaluation

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

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

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

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

ehi*_*ird 11

这不是真的:如果你能证明他们不会分歧,你可以急切地评估Haskell术语.

例如,当你看到时f x,你可以先执行多达1000步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一次处理一个元素列表,每次丢掉头部,那么你就会浪费内存.这就是为什么它很棘手:)

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