我测试了(True || True) && False,它像预期的那样返回False,因为True or True将变成True,然后将其放入True and False,返回False。即使没有parantheses,它也不应该工作吗?代码不是从左到右的工作方式吗?查看右侧是否在第二个True之后被完全忽略。我还测试了True || True && 8作为一个随机的非布尔占位符,它给出了一个错误。
(True || True) && False
False
True or True
True
True and False
True || True && 8
gorkyyrv1#
tl;dr摘要:出于同样的原因,2 + 3 * 4是24而不是20,它应该是你的参数(代码从左到右计算)。
2 + 3 * 4
24
20
&&的优先级是3,而||的优先级是2。因此,&&比||结合得更紧密,或者换句话说,True || True && False与True || (True && False)相同。根据||的定义:
&&
||
True || True && False
True || (True && False)
True || _ = True False || x = x
因此,True ||的右边是什么并不重要,结果总是True。事实上,右参数甚至没有被计算,所以即使你有一些东西导致True ||右边的无限循环或异常,结果仍然是True。请注意,这并不特定于Haskell。几乎每一种有 * 优先级 * 概念的编程语言都有比逻辑或更严格的逻辑与绑定。它甚至不是编程特有的,数学逻辑中也是如此:例如,在布尔代数中,∧比∨绑定得更紧。事实上,这是更普遍的:在|2,即整数模2,×与∧相同,+与⊻相同(XOR):| ×| 0| 1|| --|--|--|| 0| 0| 0|| 1| 0| 1|| ∧| 0| 1|| --|--|--|| 0| 0| 0|| 1| 0| 1|| +| 0| 1|| --|--|--|| 0| 0| 1|| 1| 1| 0|| ⊻| 0| 1|| --|--|--|| 0| 0| 1|| 1| 1| 0|| ∨| 0| 1|| --|--|--|| 0| 0| 1|| 1| 1| 1|因此,这些优先级规则实际上只是更一般的例子的示例,例如在标准算术中,×比+绑定得更紧。
True ||
∧
∨
×
+
⊻
0
1
1条答案
按热度按时间gorkyyrv1#
tl;dr摘要:出于同样的原因,
2 + 3 * 4
是24
而不是20
,它应该是你的参数(代码从左到右计算)。&&
的优先级是3,而||
的优先级是2。因此,
&&
比||
结合得更紧密,或者换句话说,True || True && False
与True || (True && False)
相同。根据
||
的定义:因此,
True ||
的右边是什么并不重要,结果总是True
。事实上,右参数甚至没有被计算,所以即使你有一些东西导致True ||
右边的无限循环或异常,结果仍然是True
。请注意,这并不特定于Haskell。几乎每一种有 * 优先级 * 概念的编程语言都有比逻辑或更严格的逻辑与绑定。它甚至不是编程特有的,数学逻辑中也是如此:例如,在布尔代数中,
∧
比∨
绑定得更紧。事实上,这是更普遍的:在|2,即整数模2,
×
与∧
相同,+
与⊻
相同(XOR):|
×
|0
|1
|| --|--|--|
|
0
|0
|0
||
1
|0
|1
||
∧
|0
|1
|| --|--|--|
|
0
|0
|0
||
1
|0
|1
||
+
|0
|1
|| --|--|--|
|
0
|0
|1
||
1
|1
|0
||
⊻
|0
|1
|| --|--|--|
|
0
|0
|1
||
1
|1
|0
||
∨
|0
|1
|| --|--|--|
|
0
|0
|1
||
1
|1
|1
|因此,这些优先级规则实际上只是更一般的例子的示例,例如在标准算术中,
×
比+
绑定得更紧。