交换逻辑运算符参数以加快评估速度?

时间:2016-01-29 20:00:57

标签: haskell programming-languages lazy-evaluation multiple-languages

是否有任何编程语言实现逻辑运算参数的交换(例如AND,OR)以便更快地进行评估?

示例(我认为这种方法可以用像Haskell这样的惰性评估语言实现)

  1. 假设我们已经定义了两个谓词AB
  2. 在程序执行期间,B被评估为“真”并且A未被评估
  3. 在稍后的执行中我们有条件IF A OR B
  4. 交换“OR”的参数,条件变为IF B OR A
  5. 在不评估A
  6. 的情况下,条件评估为“True”

2 个答案:

答案 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}}

如果一个操作的计算成本更低,则可以选择它。