在JavaScript等非功能语言中,渴望和懒惰评估之间的差异



在功能编程中,我了解到懒惰的评估和渴望的评估会产生相同的结果(编程语言:应用和解释书)。因此,人们可以在没有意外结果的情况下更改评估语义。

但是,在JavaScript(例如JavaScript)的非功能和工业编程语言中,我认为这两种语义都不会产生结果。例如,如果方法object.f(x)返回一个取决于对象状态的值(例如,寿命),则懒惰和渴望评估可能会返回不同的值。此外,在功能编程中,如果函数f(x)返回一个取决于CPU温度的值,我们也可能会产生不同的结果。

那么,懒惰和渴望的评估会产生不同的结果吗?即使使用功能性编程语言。

在功能编程中,我了解到懒惰的评估和急切的评估会产生相同的结果(编程语言:应用和解释书)。因此,人们可以在没有意外结果的情况下更改评估语义。

上述语句是错误的。懒惰的评估和渴望评估并不总是会产生相同的结果,以下示例证明了这一点。Haskell代码(懒惰评估):

> let forever x = forever x
> const 10 (forever 20)
10

OCAML代码(急切的评估):

# 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,而它则以渴望的语言进入无限循环。

最新更新