什么时候使用懒惰评估而不是急切评估更好?当你知道表达式只计算一次或者从不计算时,它会更好吗?
答案 0 :(得分:2)
如果您可以选择,请对可能根本不进行评估的表达式使用延迟评估,或者在评估时在某些情况下可能导致编程错误。
经典案例在C语言的大多数语言中实现,被称为"短路运算符":
if (i != 0 && n/i > 100) ...
这里,n/i > 100
只会在i
不为0时计算。这很好,因为它可以避免零分割错误。
答案 1 :(得分:1)
Why Functional Programming Matters是支持懒惰评估的典型论据,主要是作为改进模块化的推动者。
我可以通过筛选Eratosthenes为您提供一个懒惰的素数配方,
primes = (cons 2 . diff [3..] . bigU . map (\p-> [p*p, p*p+p..])) primes
(.
)是函数组合,diff
是集合差异,bigU
找到(有序的)有序列表(有序的,增加的)数字列表{{1} }是map
等等,没有懒惰的语义就必须将maintain all kinds of mechanics explicitly混合在一起,而不是使用与函数组合链接在一起的这些漂亮的单独模块化函数。