Xquery - объявить функцию для получения значения MAX входной последовательности - PullRequest
0 голосов
/ 26 апреля 2019

Мне нужно найти значение MAX входной последовательности. Следовательно, у меня есть функция ниже, но я думаю, что это слишком сложно. Подскажите, пожалуйста, есть ли более простой способ сделать это?

объявить локальную функцию: max ( $ seq as xs: anyAtomicType * ) как xs: anyAtomicType {

let $ head: = head ($ seq)

let $ tail: = tail ($ seq)

возвращение

if (пусто ($ seq)) тогда

0,0000001

еще

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

вернуть if ($ head> $ temp)

затем $ head

иначе $ temp

}; * * тысячу двадцать-пять

Местное время: макс ( ( 1,5,2,19 ) )

Возвращаемое значение 19

1 Ответ

2 голосов
/ 26 апреля 2019

Рекурсивная структура вашей функции - это та, которая закодирована функцией 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
  })
};
...