【问题标题】:Difference between eager and lazy evaluation in a non-functional language like JavaScript?像 JavaScript 这样的非函数式语言中急切和惰性求值的区别?
【发布时间】:2019-02-18 20:03:04
【问题描述】:

在函数式编程中,我了解到惰性求值和急切求值会产生相同的结果(Programming Languages: Application and Interpretation Book)。因此,可以更改评估语义而不会产生意外结果。

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

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

【问题讨论】:

  • 对于 js,这取决于您是否将 this 视为方法的参数,因为它是运行时可控的。
  • 如果你不使用call/apply/bind,那么this在对象方法中的使用反映了对象的属性,你可以考虑状态。但是请记住,对象可以被冻结,这在不可变/函数式 JS 中很常见,因此在这种情况下,函数评估的时间不会影响返回值。任何引用透明的方法也是如此。同样,如果我们打折this,如果冻结是合理的,那么方法可以/应该被视为纯函数。
  • 在函数式编程中,f(x)x的一个实际函数,意味着它的结果不能依赖于x以外的任何东西,所以它不能依赖于CPU温度。 (不过,行为上的差异仍然可能没有被捕获为 f(x) 的值,例如评估需要多长时间、内存如何使用、是否崩溃。)至于 JavaScript(“工业”? ),是的,任何函数都可能是有状态的、不纯的等。同一级别的惰性评估对此没有多大意义。
  • javascript 是函数式语言
  • @Alexan,javascript 是一种命令式语言,其功能允许编码人员在选择时保持函数式编程风格。

标签: javascript functional-programming lazy-evaluation


【解决方案1】:

在函数式编程中,我了解到惰性求值和急切求值会产生相同的结果(Programming Languages: Application and Interpretation Book)。因此,可以更改评估语义而不会产生意外结果。

上述说法是错误的。惰性求值和急切求值并不总是产生相同的结果,下面的例子证明了这一点。 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,而在急切语言中则进入无限循环。

【讨论】:

  • 我的意思是,如果一个程序(具有急切评估)无例外地工作,我可以将其评估策略更改为惰性并获得相同的结果。无论如何,你提到的一点很好,我认为我必须改进我的问题,因为你的 cmets 和其他观察结果才能结束这个问题。你怎么看?
猜你喜欢
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 2015-07-28
  • 2012-04-27
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
相关资源
最近更新 更多