【问题标题】:Any difference between Lazy evaluation and Short-circuit evaluation?懒惰评估和短路评估之间有什么区别?
【发布时间】:2013-02-01 05:53:23
【问题描述】:

来自维基百科:

Lazy evaluation 是:

在编程语言理论中,惰性求值或按需调用是 延迟表达式评估的评估策略 直到需要它的值

Short-circuit evaluation 是:

短路评估、最小评估或麦卡锡评估 表示某些编程中某些布尔运算符的语义 仅执行或评估第二个参数的语言 如果第一个参数不足以确定 表达

那么它们之间有什么区别,例如当我有时:

if(false && true && true) {
    //boo
} 

据我所知,编译器不会在false 之后执行表达式,因为我有&&,所以整个表达式最终将是false。 (对吧?)

那么这种行为是否称为延迟评估短路评估

【问题讨论】:

  • 你对parsing实际上指的是什么有一些误解。
  • @Gumbo 已编辑,我认为executing 是正确的词,不是吗?

标签: algorithm terminology lazy-evaluation short-circuiting


【解决方案1】:

不同之处在于,在惰性求值的情况下,仅在需要时才对表达式求值,而在短路求值的情况下,表达式求值会在您知道结果后立即停止。这是一种正交的概念。

惰性求值可应用于任何计算(短路方案通常仅与布尔值一起使用)。 它不会切断无用的计算,而是将整个计算延迟到需要它的结果为止。

variable = bigAndSlowFunc() or evenSlowerFnc()
if (carry out heavy computations)
  print "Here it is: ", variable
else
  print "As you wish :-)"

如果评估是惰性的,则仅当我们选择进入if 的第一个 (then) 分支时才会计算 variable,否则不会。在评估阶段(当我们为print 准备参数时)可以使用短路方案来决定我们是否需要调用evenSlowerFnc

因此,在您的示例中,它是短路评估,因为不会发生计算延迟。

【讨论】:

  • 实际上,惰性求值的使用有时会导致无用计算的中断。例如,当使用Django querysets 时,您可以根据需要使用过滤器(或排除)多次调整过滤条件:实际的 SQL 查询仅在您访问结果时运行。
  • 正如第一句所说,在惰性求值中,仅在需要其值时才对表达式求值。因此,如果永远不需要表达式的值,则永远不会评估该表达式。考虑f() && g();当需要此表达式的值时,如果f() 的计算结果为true,则g() 的值的计算将延迟到需要它为止。此外,除非需要,否则根本不会计算 g()。短路评估是惰性评估的简单案例。
  • @TheodoreNorvell,在短路评估的情况下,g() 要么被评估,要么不被评估。它根本没有延迟。好吧,在f() 完成之前它不会执行,但是这种从左到右的执行是人们在编写f() && g() 时所期望的。
  • 您已经重申了我的观点,g() 的评估会延迟到需要时再进行。那是惰性求值(对于正确的操作数)。这恰好发生在f() 被评估为true 之后,但那又怎样?将其与 E & F 进行对比,其中评估模型(在 C 中)是评估 EF,然后是(按位)“和”。 Java 有点不同,它强制对操作数进行从左到右的评估,但那又如何呢?考虑一下 Haskell 前奏曲 {True && x = x ; False && _ = False} 中 && 的定义。这与 C 的 && 完全相同,因为 Haskell 使用惰性求值。
猜你喜欢
  • 2015-09-06
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 2016-12-18
  • 2016-12-14
  • 2021-12-25
相关资源
最近更新 更多