聪明地使用严格的评估在哪里?

drt*_*drt 6 haskell lazy-evaluation

似乎有很多聪明的事情都是用懒惰评估的语言完成的,这些例子在严格评估的环境中无法完成.例如,Haskell中的无限列表,或者用树中的最小值替换树中的每个元素.

是否有任何巧妙的事情用严格评估的语言完成的例子,用懒惰评估的语言不能轻易完成?

Nor*_*sey 8

您可以使用急切(严格)语言而不是懒惰语言轻松完成的主要事项:

  • 从源代码预测程序的时间和空间成本

  • 允许副作用,包括可变数组的恒定时间更新,这使得更容易快速实现某些算法

在我看来,热切语言的主要好处是让代码以您想要的方式执行变得更加容易,并且很少有性能陷阱,其中代码的微小变化会导致性能的巨大变化.

话虽如此,总的来说我更喜欢在Haskell中编写复杂的东西.


por*_*ges 5

没有; 有一些你可以做的事情*懒惰评估(AKA正常顺序减少,或左外侧减少)你不能用严格的评估,但不是相反的方式.

这样做的原因是懒惰评估在某种程度上是评估的"最通用"方式,这被称为:

计算充分性定理:如果某些评估顺序终止并产生特定结果,则延迟评估也将终止并产生相同的结果.

*(请注意,我们不是在谈论图灵等效)


Cha*_*tin 4

嗯,不,或多或少根据定义。在惰性求值语言中,根据定义,您应该获得与积极(人们现在真的使用“严格”吗?)求值相同的结果,除了求值延迟到需要时、存储影响等等。因此,如果除此之外你还能得到一些不同的行为,那就是一个错误。