Subject: Re: XPath 3.0 How to implement the function composition operator?
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Tue, 16 Oct 2012 07:45:09 -0700
|
Great,
So we should keep up wththe latet version.
Cheers,
Dimitre
On Tue, Oct 16, 2012 at 12:43 AM, Michael Kay <mike@xxxxxxxxxxxx> wrote:
>
> See the list of changes for Saxon 9.4 at
>
> http://www.saxonica.com/documentation9.4-demo/index.html#!changes/xp30-94
>
> <quote>
> The XQuery/XPath 3.0 parser has been extended to support partial function
> application ("?" as a function argument) in dynamic function calls.
> Previously this feature was supported only in direct function calls to a
> named function.
> </quote>
>
> Michael Kay
> Saxonica
>
>
>
> On 16/10/2012 01:56, Dimitre Novatchev wrote:
>>
>> I thought that using the argument placeholder "?" could be used to
>> specify a more readable implementation.
>>
>> However it seems tht Saxon EE 9.3.05 (coming with oXygen) doesn't
>> support argument place holders.
>>
>> For this query:
>>
>> let $f := function($m as xs:integer, $n as xs:integer) as
>> xs:integer
>> {$m + $n}
>> return
>> $f(5, ?)(3)
>>
>> an error message is raised:
>>
>> Unexpected token "?" in path expression
>> Start location: 24:0
>> URL: http://www.w3.org/TR/xpath20/#ERRXPST0003
>>
>> Could someone, please, explain what is the issue with this expression?
>>
>>
>> Cheers,
>> Dimitre
>>
>>
>>
>> On Mon, Oct 15, 2012 at 4:02 PM, Michael Kay <mike@xxxxxxxxxxxx> wrote:
>>>
>>> compose is a function that takes two functions as input and produces a
>>> third
>>> function as output, so it looks like this:
>>>
>>> $compose := function($a as function(item()*) as item()*,
>>>
>>> $b as function(item()*) as item()*)
>>> as (function(item()*) as item()*)
>>> { function($c as item()*) as item()* { $b($a($c)) } }
>>>
>>> (Or the other way around. I don't know which way Haskell does it.)
>>>
>>> Michael Kay
>>> Saxonica
>>>
>>>
>>>
>>> On 15/10/2012 23:08, Costello, Roger L. wrote:
>>>>
>>>> Hi Folks,
>>>>
>>>> How is function composition implemented in XPath 3.0?
>>>>
>>>> Example: Suppose I want to compose these two function:
>>>>
>>>> 1. increment: this function increases its argument by 1.
>>>>
>>>> 2. double: this function multiplies its argument by 2.
>>>>
>>>> In Haskell I can compose the two functions like so:
>>>>
>>>> f = double . increment
>>>>
>>>> And then I can apply the composed functions to an argument:
>>>>
>>>> f 2
>>>>
>>>> The result is 6.
>>>>
>>>> How is f implemented in XPath 3.0?
>>>>
>>>> Here is my attempt, which is not correct:
>>>>
>>>> let $increment := function($x as xs:integer) {$x + 1},
>>>> $double := function($y as xs:integer) {$y *
>>>> 2},
>>>> $compose := function(
>>>> $a as
>>>> function(item()*) as item()*,
>>>> $b as
>>>> function(item()*) as item()*
>>>> )
>>>> as item()*
>>>> {$b($a)},
>>>> $f := $compose($double, $increment)
>>>> return $f(2)
>>>>
>>>> What is the correct way?
>>>>
>>>> /Roger
>
--
Cheers,
Dimitre Novatchev
---------------------------------------
Truly great madness cannot be achieved without significant intelligence.
---------------------------------------
To invent, you need a good imagination and a pile of junk
-------------------------------------
Never fight an inanimate object
-------------------------------------
To avoid situations in which you might make mistakes may be the
biggest mistake of all
------------------------------------
Quality means doing it right when no one is looking.
-------------------------------------
You've achieved success in your field when you don't know whether what
you're doing is work or play
-------------------------------------
Facts do not cease to exist because they are ignored.
-------------------------------------
Typing monkeys will write all Shakespeare's works in 200yrs.Will they
write all patents, too? :)
-------------------------------------
I finally figured out the only reason to be alive is to enjoy it.
|