是否有任何编程语言实现逻辑运算(例如 AND、OR)的参数交换以加快评估速度?
示例(我认为这种方法可以用像 Haskell 这样的惰性评估语言来实现)
- 假设我们已经定义了两个谓词
A
和B
. - 在程序执行期间,
B
被评估为“真”并且A
未被评估 - 在后面的执行中,我们有条件
IF A OR B
- “OR”的参数被交换,条件变为
IF B OR A
- 条件被评估为“真”而不评估
A
是否有任何编程语言实现逻辑运算(例如 AND、OR)的参数交换以加快评估速度?
示例(我认为这种方法可以用像 Haskell 这样的惰性评估语言来实现)
A
和B
.B
被评估为“真”并且A
未被评估IF A OR B
IF B OR A
A
在惰性求值下,AND 和 OR 不可交换。
foo :: Int -> Bool
foo n = False && foo (n+1) -- evaluates to False
bar :: Int -> Bool
bar n = bar (n+1) && False -- diverges
在热切评估(严格语义)和没有副作用的情况下,它们是可交换的。不过,我不知道这里的某些编译器正在进行任何通常的优化。(常量折叠到一边。)
当然,如果存在副作用,AND/OR 不是可交换的。例如,Ocaml 编译器不能交换参数,除非它可以证明其中至少一个是无副作用的。
它不会作为语言的一部分自动完成(可能是因为执行此重新排序检查不能自由,因此您通常最终会为无法进行的优化付费)。但是,您可以使用一些库函数来达到此目的。例如,参见unamb
。有了它,你可以写
(|||) :: Bool -> Bool -> Bool
a ||| b = (a || b) `unamb` (b || a)
如果一项操作的计算成本更低,则可以选择它。