<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:myMultiply="f:myMultiply" exclude-result-prefixes="xsl myMultiply" > <xsl:import href="curry.xsl"/> <xsl:import href="iter.xsl"/> <myMultiply:myMultiply/> <!-- This template implements the following general power fn: > power :: (Ord a, Num a, Num b) => a -> b -> b > power n x = iter n (multByX x) 1 where > multByX :: Num a => a -> a -> a > multByX x y = (*x) y Note the use of the partial application in multByX ! --> <xsl:template name="pow"> <xsl:param name="pTimes" select="0"/> <xsl:param name="pX"/> <xsl:variable name="vMultiply" select="document('')/*/myMultiply:*[1]"/> <xsl:variable name="vrtfCurriedMultByX"> <xsl:call-template name="curry"> <xsl:with-param name="pFun" select="$vMultiply"/> <xsl:with-param name="pNargs" select="2"/> <xsl:with-param name="arg2" select="$pX"/> </xsl:call-template> </xsl:variable> <xsl:variable name="vCurriedMultByX" select="$vrtfCurriedMultByX/node()"/> <xsl:call-template name="iter"> <xsl:with-param name="pTimes" select="$pTimes"/> <xsl:with-param name="pFun" select="$vCurriedMultByX"/> <xsl:with-param name="pX" select="1"/> </xsl:call-template> </xsl:template> <xsl:template match="myMultiply:*"> <xsl:param name="arg1"/> <xsl:param name="arg2"/> <xsl:value-of select="$arg1 * $arg2"/> </xsl:template> </xsl:stylesheet><
<!-- Generated by XSL2NiceXSL.xsl 2.0.2 --> stylesheet version="2.0" exclude-result-prefixes="xsl myMultiply" xmlns:myMultiply="f:myMultiply" { import "curry.xsl"; import "iter.xsl"; <myMultiply:myMultiply> <!-- This template implements the following general power fn: > power :: (Ord a, Num a, Num b) => a -> b -> b > power n x = iter n (multByX x) 1 where > multByX :: Num a => a -> a -> a > multByX x y = (*x) y Note the use of the partial application in multByX ! --> template pow( pTimes := 0, pX) { variable vMultiply := document('')/*/myMultiply:*[1]; variable vrtfCurriedMultByX := { call curry( pFun := $vMultiply, pNargs := 2, arg2 := $pX); }; variable vCurriedMultByX := $vrtfCurriedMultByX/node(); call iter( pTimes := $pTimes, pFun := $vCurriedMultByX, pX := 1); } match (myMultiply:*)( arg1, arg2) { value-of ($arg1 * $arg2); } }
Source and auto-generated text have been edited solely to replace < characters by < to make the text readable in HTML.
Edward D. Willink
14 February 2004