是否有任何编程语言实现逻辑运算参数的交换(例如AND,OR)以便更快地进行评估?
示例(我认为这种方法可以用像Haskell这样的惰性评估语言实现)
A
和B
。 B
被评估为“真”并且A
未被评估IF A OR B
IF B OR A
A
答案 0 :(得分:6)
在延迟评估下,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编译器不能交换参数,除非它能证明其中至少有一个是副作用的。
答案 1 :(得分:3)
它不是作为语言的一部分自动完成的(可能因为它不会免费来执行此重新排序检查,因此您最终会支付可以&#的优化费用39;不得做。但是,您可以使用库函数来实现此目的。例如,请参阅Tired this, no effect。有了这个,你可以写
{{1}}
如果一个操作的计算成本更低,则可以选择它。