【发布时间】: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