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

1 haskell programming-languages lazy-evaluation multiple-languages

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

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

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

chi*_*chi 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
Run Code Online (Sandbox Code Playgroud)

在急切的评价(严格的语义)和没有副作用的情况下,它们是可交换的.不过,我不知道有些编译器会进行任何常规优化.(常数折叠在一边.)

如果存在副作用,当然,AND/OR不是可交换的.例如,Ocaml编译器不能交换参数,除非它能证明其中至少有一个是无副作用的.