由于我一直在做一些遗留工作,我最近一直在学习如何在 XSLT 1.0 中使用函数式编程结构。所以我一直在学习更多关于 FXSL 的知识,并且对 foldl 有一些疑问。
<xsl:template name = "foldl" >
<xsl:param name = "pFunc" select = "/.." />
<xsl:param name = "pA0" />
<xsl:param name = "pList" select = "/.." />
<xsl:choose>
<xsl:when test = "not($pList)" >
<xsl:copy-of select = "$pA0" />
</xsl:when>
<xsl:otherwise>
<xsl:variable name = "vFunResult" >
<xsl:apply-templates select = "$pFunc[1]" >
<xsl:with-param name = "arg0" select = "$pFunc[position() > 1]" />
<xsl:with-param name = "arg1" select = "$pA0" />
<xsl:with-param name = "arg2" select = "$pList[1]" />
</xsl:apply-templates>
</xsl:variable>
<xsl:call-template name = "foldl" >
<xsl:with-param name = "pFunc" select = "$pFunc" />
<xsl:with-param name = "pList" select = "$pList[position() > 1]" />
<xsl:with-param name = "pA0" select = "$vFunResult" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
我的问题与vFunResult
变量有关。我知道它正在使用$pFunc
模板制作一个“功能”应用程序,但为什么[1]
选择器,以及为什么模板调用中的 arg0 设置为$pFunc[position > 0]
? 是否期望您将多个“功能”传递$pFunc
给foldl
?
在我见过的所有函数式编程示例中,参数 f 是单独传递的,而不是作为列表传递的,这个 Haskell 部分函数定义: foldl f z (x:xs) = foldl f (f z x) xs