Charles,

Am 02.01.2014 22:36, schrieb Charles Duffy:
While I know how to do this in a few other functional languages (for
instance, in Clojure with its atoms), I'm a bit lost in XQuery. Could I
ask for a bit of clue?

I think you are looking for `fn:fold-left(...)` and/or `fn:fold-right(...)` [1]. They can be used to thread some kind of state through while iterating over a sequence. `fn:fold-left($seq, $z, $f)` behaves similar to the following imperative snippet:

$accum <- $z;
foreach($item in $seq) {
  $accum <- $f($accum, $item);
}
return $accum;

Your algorithm could be written like this (untested):

fn:fold-left(
  $inputs,
  map:new(),
  function($already-seen, $element) {
    if(local:map-contains-prefix-of($already-seen, $element))
    then $already-seen
    else (
      let $result := expensive-operation($element)
      return map:new((
        $already-seen,
        map:entry(get-key($element), $result)
      ))
    )
  }
)

Hope that helps,
  Leo

[1] http://www.w3.org/TR/xpath-functions-30/#func-fold-left
_______________________________________________
[email protected]
http://x-query.com/mailman/listinfo/talk

Reply via email to