关于函数式编程语言的几个问题让我开始思考 XSLT 是否是一种函数式编程语言。如果没有,缺少哪些功能?XSLT 2.0 是否缩短或缩小了差距?
6 回答
XSLT 是声明性的,而不是有状态的。
虽然 XSLT 基于函数式编程思想,但它不是一个完整的函数式编程语言,它缺乏将函数视为第一类数据类型的能力。它具有诸如惰性评估之类的元素,以减少不需要的评估以及没有显式循环。
不过,就像函数式语言一样,我认为它可以很好地与跨多个处理器的自动安全多线程并行化。
来自XSLT 上的维基百科:
作为一种语言,XSLT 受到函数式语言以及基于文本的模式匹配语言(如 SNOBOL 和 awk)的影响。它最直接的前身是 DSSSL,这种语言对 SGML 执行的功能与 XSLT 对 XML 执行的功能相同。XSLT 也可以被认为是一个模板处理器。
这是一个在FXSL 的帮助下使用XSLT 作为函数式语言的好网站。FXSL 是一个实现对高阶函数的支持的库。
由于 FXSL,我认为 XSLT 本身不需要功能齐全。也许 FXSL 将来会作为 W3C 标准包含在内,但我没有这方面的证据。
我相信你们现在已经找到了这个链接:-) http://fxsl.sourceforge.net/articles/FuncProg/Functional%20Programming.html。
XSLT 中的好函数毕竟是一流的公民,但有一些变通方法 :-)
这就是我编程时的感觉。
XSLT 完全基于定义函数并将它们应用于输入流中的选定事件。
XSLT 允许您设置一个变量。函数式编程不允许函数有副作用——这是一个大问题。
尽管如此,在 XSLT 中编写时,“感觉就像以 FP 方式工作一样。您正在使用输入 - 您没有更改它 - 以创建输出。
这是一个非常非常不同于使用 DOM API 时使用的编程模型。DOM 根本不分离输入和输出。你得到了一个数据结构——你可以按照你认为合适的方式破坏它——没有犹豫、限制或悔恨。
只要说你喜欢 FP 及其背后的原则,你可能会觉得在其中工作很舒服。就像事件驱动编程的经验——以及 XML 本身一样——也会让您对它感到满意。
如果您唯一的经验是使用自上而下的非事件驱动程序 - 那么 XSLT 将是非常陌生的,确实是陌生的风景。至少一开始是这样。积累一点经验,然后当 XPath 表达式和事件处理对您来说真的很舒服时再回到 XSLT,将会获得丰厚的回报。
在大多数情况下,使 XSLT 不是 100% 函数式编程语言的原因在于它无法将函数视为一流的数据类型。
可能还有其他一些——但这是显而易见的答案。
祝你好运!
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()
这不是一个真正的论点,因为您只能声明变量,而不能在声明后更改它们的值。从这个意义上说,它是声明式而不是命令式,正如 Novatchev 先生的文章中所述。
像 Scheme 或 Erlang 这样的函数式编程语言也可以让你声明变量,在 Haskell 中你也可以这样做:
-- 函数 'test' 获取变量 x 并将其添加到列表 xs 的每个元素上
test :: [Int] -> [Int]
test xs = map (+ x) xs
where x = 2