Programming languages Erlang中非短路布尔运算符的用途是什么?

Programming languages Erlang中非短路布尔运算符的用途是什么?,programming-languages,functional-programming,erlang,logic-programming,Programming Languages,Functional Programming,Erlang,Logic Programming,我正在从LearnyYouSomeerlang网络书学习Erlang。在学习过程中,有一件事让我印象深刻,那就是非短路布尔连接和分离运算符,即和和或。这些操作员的用例是什么?为什么要使用它们而不是和和或或 在R13A之前,andalso和orelse都不是尾部递归的。有关详细信息,请参阅。我认为没有充分的理由在新程序中使用和/或。和/或运算符只是旧得多。andalso/orelse运算符是后来添加的。和/或今天的一个用例可能是,您只想执行一些简单的布尔运算,而水平空间比可能节省几个机器周期更重要

我正在从LearnyYouSomeerlang网络书学习Erlang。在学习过程中,有一件事让我印象深刻,那就是非短路布尔连接和分离运算符,即<代码>和和
。这些操作员的用例是什么?为什么要使用它们而不是

在R13A之前,
andalso
orelse
都不是尾部递归的。有关详细信息,请参阅。我认为没有充分的理由在新程序中使用
/

和/或运算符只是旧得多。andalso/orelse运算符是后来添加的。和/或今天的一个用例可能是,您只想执行一些简单的布尔运算,而水平空间比可能节省几个机器周期更重要。例如:

X = Y and (A or B),
而不是

X = Y andalso (A orelse B),
对眼睛来说比较容易


出于向后兼容性的原因,不可能仅仅改变原始的行为和/或变得短路,因此需要新的关键字。名称和ALSO/orelse来自标准ML。

我认为它们在做不同的事情,并使用它们:

  • /
    作为逻辑运算符,我要在其中比较逻辑值。由于它们很严格,我会自动进行类型检查,并且我确切地知道所称的内容
  • 用于控制的
    /
    orelse
    ,与C中的
    &
    |
    非常相似

看到erlang中定义了错误,我觉得很高兴知道执行了什么以及如何执行。

标记为
逻辑编程
,因为我被告知这与Prolog中erlang的起源有关。相关:。有趣的链接。谢谢你的回答!1.
andalso
orelse
也可以用作逻辑运算符。2.我一点也不懂类型检查。3.知道所调用的内容与引用透明表达式无关;它只与副作用相关。我认为Robert所说的是,有时您希望对所有操作数求值,以便它们可以引发异常,即使它们不是求值谓词所必需的。这是一个很好的观点。@dsmith:是的,这两种方法都可以用来检查它们是否实际返回布尔值。我可能过于谨慎,但尽早发现错误是件好事。