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