关于函数式编程语言的几个问题让我想到XSLT是否是一种函数式编程语言。如果没有,缺少哪些功能? XSLT 2.0是缩短还是缩小了差距?
答案 0 :(得分:28)
XSLT是声明性的而不是有状态的。
虽然XSLT基于函数式编程思想,但它不是一种完整的函数式编程语言,它缺乏将函数视为一级数据类型的能力。它具有惰性评估等元素,可减少不必要的评估,也缺少显式循环。
虽然像函数式语言一样,但我认为可以通过多个处理器自动安全多线程很好地并行化。
作为一种语言,XSLT受到影响 函数式语言,以及 基于文本的模式匹配语言 喜欢SNOBOL和awk。它最直接 前身是DSSSL,一种语言 为SGML执行相同的功能 XSLT为XML执行。 XSLT可以 也被视为模板 处理器。
这是一个很好的网站,在FXSL的帮助下使用XSLT as a functional language。 FXSL是一个实现对高阶函数的支持的库。
由于FXSL,我不认为XSLT本身需要完全正常运行。也许FXSL将来会被列为W3C标准,但我没有证据证明这一点。
答案 1 :(得分:7)
我相信你们现在已经找到了这个链接:-) http://fxsl.sourceforge.net/articles/FuncProg/Functional%20Programming.html。
XSLT中的良好功能是一流的公民,毕竟还有一些解决方法: - )
答案 2 :(得分:6)
这就是我编程时的感受。
XSLT完全基于定义函数并将它们应用于输入流中的选定事件。
XSLT允许您设置变量。功能编程不允许函数产生副作用 - 这是一个很大的问题。
尽管如此,在XSLT中写作时,人们也有同样的“感觉就像以FP方式工作。你正在使用输入 - 你没有改变它 - 创建输出。
这是一个非常非常不同的编程模型,与使用DOM API时使用的编程模型非常不同。 DOM根本不分开输入和输出。你会得到一个数据结构 - 你可以毫不犹豫,限制或悔恨地将它看作适合你的方式。
只需说一下你是否喜欢FP及其背后的原理,你可能会感到很舒服。就像使用事件驱动编程的经验 - 以及XML本身 - 也会让你感到舒服。
如果您唯一的体验是自上而下,非事件驱动的程序 - 那么XSLT将非常陌生,确实是外星人的风景。至少在开始时。增加一点经验然后回到XSLT,当XPath表达式和事件处理对你来说真的很舒服时,你会得到很好的回报。
答案 3 :(得分:5)
在大多数情况下,XSLT不是100%函数式编程语言的原因是它无法将函数视为一流的数据类型。
可能还有其他一些 - 但这是明显的答案。
祝你好运!答案 4 :(得分:4)
Saxon-SA引入了一些使XSLT功能正常的扩展功能。您可以使用saxon:function()
创建一个函数值(实际上是{http://net.sf.saxon/java-type}net.sf.saxon.expr.UserFunctionCall
值),然后使用saxon:call()
调用该值。
Saxon-B与saxon:expression()
和saxon:eval()
的配对功能相似。区别在于saxon:expression()
采用任何XPath表达式,saxon:eval()
对其进行求值,而saxon:function()
采用saxon:call()
调用的函数的名称。
答案 5 :(得分:0)
这不是一个真正的论证,因为你只能声明变量,而不是在声明后改变它们的值。从这个意义上来说,正如诺瓦切夫先生的文章所述,它是陈述性的而不是命令式的风格。
Scheme或Erlang等函数式编程语言也可以声明变量,在Haskell中你也可以这样做:
- 函数'test'接受变量x并将其添加到列表xs
的每个元素上test :: [Int] -> [Int]
test xs = map (+ x) xs
where x = 2