A couple of weeks ago, we have suggested to introduce a enumerator function into the XPath (see [F+O30] A enumerator function):
I would like the WG to consider an addition of a function that turns a sequence into a enumeration of values. Consider a function like this: fn:enumerator($items as item()*) as function() as item()?; alternatively, signature could be: fn:enumerator($items as function() as item()*) as function() as item()?; This function receives a sequence, and returns a function item, which upon N's call shall return N's element of the original sequence. This way, a sequence of items is turned into a function providing a enumeration of items of the sequence. As an example consider two functions: a) t:rand($seed as xs:double) as xs:double* - a function producing a random number sequence; b) t:work($input as element()) as element() - a function that generates output from it's input, and that needs random numbers in the course of the execution. t:work() may contain a code like this: let $rand := fn:enumerator(t:rand($seed)), and later it can call $rand() to get a random numbers. Enumerators will help to compose algorithms where one algorithm communicate with other independant algorithms, thus making code simpler. The most obvious class of enumerators are generators: ordered numbers, unique identifiers, random numbers. Technically, function returned from fn:enumerator() is nondetermenistic, but its "side effect" is similar to a "side effect" of a function generate-id() from a newly created node (see bug #13747, and bug #13494).
The idea is inspired by a generator function, which returns a new value upon each call.
Such function can be seen as a stateful object. But our goal is to look at it in a more functional way. So, we look at the algorithm as a function that produces a sequence of output, which is pure functional; and an enumerator that allows to iterate over algorithm's output.
This way, we see the function that implements an algorithm and the function that uses it can be seen as two thread of functional programs that use messaging to communicate to each other.
Honestly, we doubt that WG will accept it, but it's interesting to watch the discussion.
Remember Me
a@href@title, b, blockquote@cite, em, i, strike, strong, sub, super, u