在函数式编程中,我了解到懒惰评估和急切的评估会产生相同的结果(编程语言:应用程序和解释手册)。因此,可以在不产生意外结果的情况下更改计算语义。
但是,在像JavaScript这样的非功能和工业编程语言中,我不认为这两种语义都会产生结果。例如,如果方法object.f(x)返回依赖于对象状态(例如生存期)的值,则懒惰和急切的计算可能返回不同的值。此外,在函数式编程中,如果函数f(x)返回一个取决于例如CPU温度的值,我们也可能会有不同的结果。
那么,懒惰和急切的评估会产生不同的结果吗?即使在函数式编程语言中。
发布于 2019-03-04 19:59:02
在函数式编程中,我了解到懒惰评估和急切的评估会产生相同的结果(编程语言:应用程序和解释手册)。因此,可以在不产生意外结果的情况下更改计算语义。
上述说法是错误的。懒惰评估和急切评价并不总是产生相同的结果,下面的例子证明了这一点。Haskell代码(惰性评估):
> let forever x = forever x
> const 10 (forever 20)
10OCaml代码(急切的评估):
# let const a b = a;;
val const : 'a -> 'b -> 'a = <fun>
# let rec forever x = forever x;;
val forever : 'a -> 'b = <fun>
# const 10 (forever 20);;
^CInterrupted.正如您所看到的,相同的表达式在惰性语言中生成结果10,而在急切的语言中则进入无限循环。
https://stackoverflow.com/questions/54754566
复制相似问题