如何以不需要比产生的收益更多的开销的方式实现惰性评估?

mcz*_*nek 6 haskell runtime compilation lazy-evaluation

我知道有些地方懒惰评估会阻止需要计算。例如,将两个数字相加,然后将它们传递给一个最终从未被使用的函数参数。

但在我看来,存储和加载稍后要使用的操作会产生很多开销,而且这种开销通常会抵消任何收益。

有人可以解决这个问题吗?

com*_*orm 6

你是对的。惰性求值确实有很大的开销,而且大多数时候你不会从中获得实际的性能提升。惰性求值的主要原因是它很方便——它使 Haskell 的语言语义更清晰,并且(例如)惰性/无限列表有时对程序员来说很方便。

幸运的是,编译器通常可以优化内部循环之外的惰性机制,否则幼稚的实现会导致显着的性能损失。

  • 惰性使得类似 C 的原语 if/then 和短路和/或运算符只是函数。惰性列表是 C++ 迭代器的更易于使用的替代品。恕我直言,懒惰并不是 Haskell 最有趣的事情,普遍的懒惰有其缺点,程序员需要记住参数评估是在函数的控制之下,但它也有优点。 (2认同)