14

我从LearnYouSomeErlang网络书上学习Erlang。有一件事让我感到震惊,那就是非短路布尔连接和分离运算符,也就是说, andor。这些操作员的用例是什么?你为什么要使用它们而不是andalsoorelseErlang中非短路布尔运算符的用途是什么?

+0

用'逻辑Programming'标签,因为有人告诉我,这已经是与Erlang的Prolog语言的起源。 – missingfaktor

+0

相关:[当偏爱'和''上在andalso'后卫试验](http://stackoverflow.com/questions/6025132/when-to-prefer-and-over-andalso-in-guard-tests)。 – kay

回答

4

的和/或运营商只是老得多。 andalso/orelse运营商是后来增加的。当前和/或今天的用例可能是当你只想执行一些简单的布尔操作时,水平空间比可能节省几个机器周期更重要。例如:

X = Y and (A or B), 

而不是

X = Y andalso (A orelse B), 

是对眼睛更容易一些。

为了向后兼容的原因,不可能只是改变原来的和/或行为变成短路,所以需要有新的关键字。标准ML还有其他名称和名称。

5

我看到他们做不同的事情,并把它们作为这样的:

  • and/or逻辑运算符,我想比较的逻辑值。由于它们很严格,我会自动进行类型检查,并且我会自动进行类型检查。在C.
  • andalso/orelse控制,就像&&||

发现错误,在二郎定义,我觉得这是很好的了解已经执行,以及它如何去。

+0

1.'andalso'和'orelse'也可以用作逻辑运算符。 2.我不了解类型检查的一点。 3.知道所称的内容与引用透明的表达无关;它只是在副作用的情况下才有意义。 – missingfaktor

+0

我认为罗伯特所说的是,有时候你希望所有的操作数都被评估,以便他们能够引发异常,即使它们不是评估谓词所必需的。这是一个很好的观点。 – dsmith

+0

@dsmith:是的,这两个,并检查他们实际上返回布尔值。我可能过于谨慎,但尽可能早地发现错误是件好事。 – rvirding