为什么要使用"或"而不是" xor"在定义?

时间:2017-01-29 12:51:13

标签: xml haskell types computer-science definition

这可能是一个微不足道的问题,但我真的无法在任何地方找到答案。计算机科学中有一个我认为特殊的惯例。

haskell datatypes中可以像这样定义:

data Bool = False | True

在xml qualified names中定义如下:

QName   ::=   PrefixedName | UnprefixedName

可能有更多类似的例子,但这应该足够了。

通常it is well understood |(竖线或条形)应该被理解为or。但这似乎很奇怪。当A和B都为真时,A or B也是如此。虽然在第一个例子中有意义(有可能同时有TrueFalse,但我们隐含地假设了非矛盾的定律),它并没有在第二个:某些东西是PrefixedNameUnprefixedName它不能同时存在。

那为什么经常这样呢?为什么不使用独家或?有没有非传统的原因?

3 个答案:

答案 0 :(得分:8)

这个data X = A | B符号实际上不应该被理解为逻辑OR(尽管这与直观的含义非常相符)。它的真正含义是XAB总和类型,即coproduct。现在,关于布尔值的产品操作实际上是AND,所以双重自然是OR。

尽管如此,对布尔数的向量空间的求和操作实际上是异或,所以我们转了一圈......

我只是不会读太多。 |只是一个象征;在类C语言中,它恰好也意味着按位OR,但实际逻辑OR通常用不同的方式表示,无论是||还是

答案 1 :(得分:2)

|用于分隔互斥选项列表中的项目的历史悠久:

  1. 正则表达式:a* | b*表示字符串可以是0或更多a s或0或更多b s,但不能同时为两者。

  2. 用于表示无上下文语法的Backus-Naur形式:

    Expr ::= Term | Expr AddOp Term
    

    其中表达式可以是单个术语,也可以是与带有加法运算符的术语组合的另一个表达式。 (它不能同时发生。)

  3. 命令行程序的用法消息:

    git branch (-d | -D) [-r] <branchname>...
    

    此处git branch命令可以采用-d-D选项,但不能同时采用同一调用。

  4. 哈斯克尔的data陈述延续了这一传统;它与使用|作为逻辑或按位运算符无关。

    (如果有的话,对于按位|使用OR可能是受Backus-Naur形式的启发,在这种情况下,您可能会问为什么|被用于OR代替XOR。)

答案 2 :(得分:1)

我认为“或”的含义在字面意义上与数学意义相对。使用术语“或”表示该值可以包含一个值或另一个值。它不是一个旨在确定真值的运算符。

虽然为此使用“或”运算符符号可能不完全合乎逻辑,但它在为读者提供重点方面做得非常好。这种清晰度最终是语言所追求的目标。只要有更大比例的读者能够将其解释为“文字”用法而不是“数学”操作员用法,使用或在字面意义上意味着你作为一种语言,在获得你的作品方面做得更好指出,使方法优于使用XOR等。