在Haskell中,为什么`True|| True和False` return True

qncylg1j  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(100)

我测试了(True || True) && False,它像预期的那样返回False,因为True or True将变成True,然后将其放入True and False,返回False。即使没有parantheses,它也不应该工作吗?代码不是从左到右的工作方式吗?
查看右侧是否在第二个True之后被完全忽略。我还测试了True || True && 8作为一个随机的非布尔占位符,它给出了一个错误。

gorkyyrv

gorkyyrv1#

tl;dr摘要:出于同样的原因,2 + 3 * 424而不是20,它应该是你的参数(代码从左到右计算)。

&&的优先级是3,而||的优先级是2。
因此,&&||结合得更紧密,或者换句话说,True || True && FalseTrue || (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|
因此,这些优先级规则实际上只是更一般的例子的示例,例如在标准算术中,×+绑定得更紧。

相关问题