在像JavaScript这样的非功能性语言中,渴望和懒惰评估之间的区别?

问题描述 投票:0回答:1

在函数式编程中,我了解到惰性求值和热切评估会产生相同的结果(编程语言:应用和解释书)。因此,可以在不产生意外结果的情况下更改评估语义。

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

那么,懒惰和急切的评估会产生不同的结果吗?即使是在函数式编程语言中。

javascript functional-programming lazy-evaluation
1个回答
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,而它在热切的语言中进入无限循环。

© www.soinside.com 2019 - 2024. All rights reserved.