<xsl:function name="f:fib">

<xsl:param name="n" as="xs:integer" />

<xsl:param name="countfun" as="function(*)" />

<xsl:sequence select="

if ($n = 1 or $n = 2)

then $countfun(1)

else let $first :=

function($x as xs:integer) as function(*)

{

let $second := function($y as xs:integer) as function(*)

{

$countfun($x + $y)

}

return f:fib($n - 2, $second)

}

return f:fib($n - 1, $first)" />

</xsl:function>

and I call it as follows:

<xsl:value-of select="f:fib(10, function($a as xs:integer){$a})" />

the expected result is 55. However, I receive the following error:

Engine name: Saxon-EE 9.4.0.4

Severity: fatal

Description: Required item type of second argument of anonymous function is function(); supplied value has item type xs:integer

Start location: 36:0

URL: http://www.w3.org/TR/xslt20/#err-XTTE0790

The function is inspired by this snippet http://fssnip.net/eU, though other functional languages have similar examples. The idea behind the excercise is to eliminate the double recursive exit point of the function by creating a continuation function. However, either the error is confusing (I don't see any anonymous function call with a function argument) or something else is happening.

I also tried the fully typed version, and an untyped version. Here's the fully typed variant:

<xsl:function name="f:fib" as="xs:integer">

<xsl:param name="n" as="xs:integer" />

<xsl:param name="countfun" as="function(xs:integer) as xs:integer" />

<xsl:sequence select="

if ($n = 1 or $n = 2)

then $countfun(1)

else let $first :=

function($x as xs:integer) as xs:integer

{

let $second := function($y as xs:integer) as xs:integer

{

$countfun($x + $y)

}

return f:fib($n - 2, $second)

}

return f:fib($n - 1, $first)" />

</xsl:function>

Any idea what I'm missing here, or is this perhaps an error with Saxon?

Thanks,

Abel