在函数式编程中,我了解到惰性评估和渴望评估会产生相同的结果(编程语言:应用程序和解释书)。因此,可以更改评估语义而不会产生意外结果。
但是,在像JavaScript这样的非功能性工业编程语言中,我认为这两种语义都不会产生结果。例如,如果方法object.f(x)
返回的值取决于对象状态(例如生存期),则懒惰和急切的评估可能返回不同的值。另外,在函数式编程中,如果函数f(x)
返回的值取决于例如CPU温度,则我们可能会得到不同的结果。
那么,懒惰而热切的评估可能会产生不同的结果吗?即使使用功能性编程语言。
答案 0 :(得分:0)
在函数式编程中,我了解到惰性评估和渴望评估会产生相同的结果(编程语言:应用程序和解释书)。因此,可以更改评估语义而不会产生意外结果。
以上说法是错误的。惰性评估和渴望评估并不总是产生相同的结果,下面的示例对此进行了证明。 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
,而它以渴望的语言陷入无限循环。