关于函数式编程语言的几个问题让我思考XSLT是否是一种函数式编程语言。如果不是,它缺少哪些特性?XSLT 2.0 缩短或弥合了这种差距吗?
关于函数式编程语言的几个问题让我思考XSLT是否是一种函数式编程语言。如果不是,它缺少哪些特性?XSLT 2.0 缩短或弥合了这种差距吗?
XSLT是声明性的,与有状态的相对。
虽然XSLT基于函数式编程思想,但它不是完整的函数式编程语言,它缺乏将函数视为一等数据类型的能力。它有像惰性求值这样的元素来减少不必要的求值,还有显式循环的缺失。
尽管像函数式语言一样,我认为它可以通过自动安全多线程跨多个处理器进行良好的并行化。
来自XSLT的维基百科:
作为一种语言,XSLT受到函数式语言和基于文本模式匹配的语言(如SNOBOL和awk)的影响。它最直接的前身是DSSSL,一种为SGML执行与XSLT为XML执行相同功能的语言。 XSLT也可以被视为模板处理器。
这是一个关于使用XSLT作为函数式语言的伟大网站,借助FXSL的帮助。 FXSL是一个实现支持高阶函数的库。
由于FXSL的存在,我认为XSLT没有必要成为完全的函数式语言。也许FXSL将来会作为W3C标准包含在内,但我没有证据。
xsl:for-each
时,你在一个集合上创建了一个 _投影_。 - Abelxsl:message
,它创建了一个副作用,无法保证它被调用的频率和顺序(虽然有方法可以强制执行)。因此,这不仅是一个实现细节,但这非常符合函数式编程的特性。 - Abel<variable>
让我想到一些会变化的东西(在运行时)- <constant>
更准确。事实上,我记得我的 XSLT 经验尤其尴尬,特别是因为我期望它以一种它实际上并没有被设计用来表现的方式来运作,这与 Java 程序员第一次使用 Javascript 的感觉非常相似。 - Camilo Martin大多数情况下,使XSLT不成为100%功能性编程语言的原因是其无法将函数视为一级数据类型。
可能还有其他原因,但这是显而易见的答案。
祝好运!
saxon:function()
创建一个函数值(实际上是{http://net.sf.saxon/java-type}net.sf.saxon.expr.UserFunctionCall
值),然后使用saxon:call()
调用它。saxon:expression()
和saxon:eval()
。不同之处在于,saxon:expression()
接受任何XPath表达式,并且saxon:eval()
对其进行评估,而saxon:function()
则接受一个函数名称,saxon:call()
调用该函数。这并不是一个真正的争论,因为你只能声明变量,而不能在声明后更改它们的值。从这个意义上说,它是声明式而不是命令式风格,正如Novatchev先生在他的文章中所述。
像Scheme或Erlang这样的函数式编程语言也可以声明变量,在Haskell中你也可以这样做:
-- 函数'test'接受变量x并将其添加到列表xs的每个元素上
test :: [Int] -> [Int]
test xs = map (+ x) xs
where x = 2