24

关于函数式编程语言的几个问题让我开始思考 XSLT 是否是一种函数式编程语言。如果没有,缺少哪些功能?XSLT 2.0 是否缩短或缩小了差距?

4

6 回答 6

30

XSLT 是声明性的,而不是有状态的。

虽然 XSLT 基于函数式编程思想,但它不是一个完整的函数式编程语言,它缺乏将函数视为第一类数据类型的能力。它具有诸如惰性评估之类的元素,以减少不需要的评估以及没有显式循环。

不过,就像函数式语言一样,我认为它可以很好地与跨多个处理器的自动安全多线程并行化。

来自XSLT 上的维基百科

作为一种语言,XSLT 受到函数式语言以及基于文本的模式匹配语言(如 SNOBOL 和 awk)的影响。它最直接的前身是 DSSSL,这种语言对 SGML 执行的功能与 XSLT 对 XML 执行的功能相同。XSLT 也可以被认为是一个模板处理器。

这是一个在FXSL 的帮助下使用XSLT 作为函数式语言的好网站。FXSL 是一个实现对高阶函数的支持的库。

由于 FXSL,我认为 XSLT 本身不需要功能齐全。也许 FXSL 将来会作为 W3C 标准包含在内,但我没有这方面的证据。

于 2008-09-21T02:29:02.763 回答
7

我相信你们现在已经找到了这个链接:-) http://fxsl.sourceforge.net/articles/FuncProg/Functional%20Programming.html

XSLT 中的好函数毕竟是一流的公民,但有一些变通方法 :-)

于 2009-01-29T18:37:34.007 回答
6

这就是我编程时的感觉。

XSLT 完全基于定义函数并将它们应用于输入流中的选定事件。

XSLT 允许您设置一个变量。函数式编程不允许函数有副作用——这是一个大问题。

尽管如此,在 XSLT 中编写时,“感觉就像以 FP 方式工作一样。您正在使用输入 - 您没有更改它 - 以创建输出。

这是一个非常非常不同于使用 DOM API 时使用的编程模型。DOM 根本不分离输入和输出。你得到了一个数据结构——你可以按照你认为合适的方式破坏它——没有犹豫、限制或悔恨。

只要说你喜欢 FP 及其背后的原则,你可能会觉得在其中工作很舒服。就像事件驱动编程的经验——以及 XML 本身一样——也会让您对它感到满意。

如果您唯一的经验是使用自上而下的非事件驱动程序 - 那么 XSLT 将是非常陌生的,确实是陌生的风景。至少一开始是这样。积累一点经验,然后当 XPath 表达式和事件处理对您来说真的很舒服时再回到 XSLT,将会获得丰厚的回报。

于 2008-10-19T15:12:48.213 回答
5

在大多数情况下,使 XSLT 不是 100% 函数式编程语言的原因在于它无法将函数视为一流的数据类型。

可能还有其他一些——但这是显而易见的答案。

祝你好运!

于 2008-09-21T02:23:46.287 回答
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()

于 2008-09-21T16:53:46.163 回答
1

这不是一个真正的论点,因为您只能声明变量,而不能在声明后更改它们的值。从这个意义上说,它是声明式而不是命令式,正如 Novatchev 先生的文章中所述。

像 Scheme 或 Erlang 这样的函数式编程语言也可以让你声明变量,在 Haskell 中你也可以这样做:

-- 函数 'test' 获取变量 x 并将其添加到列表 xs 的每个元素上

test :: [Int] -> [Int]
test xs = map (+ x) xs
where x = 2
于 2009-03-11T12:26:26.250 回答