一般比较与价值比较

时间:2015-01-01 19:01:16

标签: xquery

为什么XQuery以不同的方式处理以下表达式?

  • () = 2返回false(一般比较)
  • () eq 2返回空序列(值比较)

1 个答案:

答案 0 :(得分:5)

XQuery规范中解释了这种效果。对于XQuery 3,它在章节3.7.1, Value Comparisons中(由我添加突出显示):

  
      
  1. 将雾化应用于操作数。此操作的结果称为雾化操作数。
  2.   
  3. 如果雾化操作数是空序列,则值比较的结果是空序列,并且实现不需要评估其他操作数或应用运算符。但是,实现可以选择评估另一个操作数,以确定它是否引发错误。
  4.   

因此,如果您要比较两个单个元素序列(或标量值,它们等于那些),您将按预期收到true / false值:

  • 1 eq 2false
  • 2 eq 2true
  • (1) eq 2false
  • (2) eq 2true
  • (2) eq (2)true

但是,如果一个或两个操作数都是空列表,您将收到空列表:

  • () eq 2()
  • 2 eq ()()
  • () eq ()()

此行为允许您传递空序列,这可以在此处用作一种null值。正如@adamretter在评论中添加的那样,空序列()的有效布尔值为false,所以即使你运行if ( () eq 2) ...之类的东西,你也不会发现任何令人惊讶的事情。

如果任何操作数包含多个元素的列表,则表示类型错误。

常规比较$sequence1 = $sequence2测试$sequence1中的任何元素在$sequence2中是否具有相等的元素。由于这在语义上已经支持任意长度的序列,因此不必应用雾化。

为什么?

差异来自运营商强加的要求'签名。如果以基于集合的方式比较任意长度的序列,则没有理由为空序列包含任何特殊情况 - 如果包含空序列,则根据定义自动比较false

对于比较单值的运算符,必​​须考虑传递空序列的情况;决定不是引发错误,而是返回一个等于false的值:空序列。这允许使用空序列作为一种null值,当值未知时;任何与未知值相比的东西都不能是true,但绝不能(必然)是假的。如果需要,可以检查empty(...)结果,如果是,则要比较的值之一是未知的;否则他们就会变得与众不同。在Java和其他语言中,null值将用于实现类似的结果,在Haskell中有Data.Maybe