Xquery-声明一个函数以获取输入序列的最大值

时间:2019-04-26 10:15:25

标签: xml xquery

我需要找到输入序列的最大值。因此,我在下面有一个函数,但我认为它太复杂了。您能否建议是否有更简单的方法?

声明函数local:max( $ seq作为xs:anyAtomicType * )作为xs:anyAtomicType {

让$ head:= head($ seq)

让$ tail:= tail($ seq)

返回

if(empty($ seq))然后

0.0000001

其他

让$ temp:= local:max($ tail)

返回if($ head> $ temp)

然后$ head

其他$ temp

};

local:max( ( 1,5,2,19 ) )

返回值为19

1 个答案:

答案 0 :(得分:2)

函数的递归结构正是由高阶XQuery函数fn:fold-right($seq, $start, $func)编码的结构。因此,通过提供比较和初始值,您可以更简洁地获得相同的功能:

declare function local:max($seq as xs:anyAtomicType*) as xs:anyAtomicType? {
  fn:fold-right($seq, 0.0000001, function($next, $max) {
    if($max >= $next) then $max else $next
  })
};

由于在这种情况下,从左到右或从右到左处理这些项目都没有关系,所以最好使用fn:fold-left(...),因为它可以潜在地利用对输入的流评估顺序。如果输入为空,则在XQuery中更典型的是返回空序列()(这也是fn:max(...)的工作)。进行以下两项更改会导致:

declare function local:max2($seq as xs:anyAtomicType*) as xs:anyAtomicType? {
  fold-left($seq, (), function($max, $next) {
    if($max >= $next) then $max else $next
  })
};