XSLT是函数式编程语言吗?

XSLT是函数式编程语言吗?,xslt,functional-programming,fxsl,Xslt,Functional Programming,Fxsl,关于函数式编程语言的几个问题让我思考XSLT是否是函数式编程语言。如果没有,缺少哪些功能?XSLT 2.0是否缩短或缩小了差距?在大多数情况下,XSLT不是100%函数式编程语言的原因在于它无法将函数视为一流的数据类型 也许还有其他一些,但这是显而易见的答案 祝你好运 XSLT是声明性的,而不是有状态的 尽管XSLT基于函数式编程思想,但它不是一种完整的函数式编程语言,它缺乏将函数视为第一类数据类型的能力。它具有诸如延迟求值之类的元素,以减少不必要的求值以及显式循环的缺失 不过,就像函数式语言一

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

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

也许还有其他一些,但这是显而易见的答案


祝你好运

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

尽管XSLT基于函数式编程思想,但它不是一种完整的函数式编程语言,它缺乏将函数视为第一类数据类型的能力。它具有诸如延迟求值之类的元素,以减少不必要的求值以及显式循环的缺失

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

发件人:

作为一种语言,XSLT受到以下因素的影响 函数式语言,以及 基于文本的模式匹配语言 像斯诺波尔和奥克。最直接的 其前身是DSSL,一种 对SGML执行相同的功能 XSLT对XML执行的操作。XSLT可以 也可以被视为模板 处理器

这是一个关于使用FXSL的好网站。FXSL是一个实现对高阶函数支持的库


因为FXSL,我认为XSLT本身不需要完全功能化。也许FXSL将来会作为W3C标准加入,但我没有证据证明这一点

Saxon SA引入了一些扩展函数,使XSLT功能化。您可以使用创建函数值(实际上是
{http://net.sf.saxon/java-type}net.sf.saxon.expr.UserFunctionCall
value),然后使用
saxon:call()调用它


Saxon-B与和的配对功能类似
Saxon:eval()
。不同之处在于
saxon:expression()
接受任何XPath表达式,并且
saxon:eval()
对其求值,而
saxon:function()
接受一个函数的名称,该函数调用了
saxon:call()
调用。

这就是我编程时的感觉

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

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

尽管如此,使用XSLT编写时,您仍然有着与FP方式相同的“感觉。您使用的是输入,而不是更改输入,以创建输出。”

这是一个与使用DOM API时使用的非常非常不同的编程模型。DOM根本不分离输入和输出。您得到了一个数据结构,并且您可以毫不犹豫、不受限制或不后悔地将其破坏

如果您喜欢FP及其背后的原则,您可能会觉得在其中工作很舒服。就像事件驱动编程的经验——以及XML本身——也会让您感到舒适


如果您只有使用自上而下、非事件驱动的程序的经验,那么XSLT将是一个非常陌生、陌生的领域。至少一开始是这样。增加一点经验,然后在XPath表达式和事件处理对您来说非常舒适的时候再使用XSLT,这将带来丰厚的回报。

我相信你们已经发现了这个问题墨水到现在为止:-)


XSLT中的函数是一流的公民,毕竟有一些解决方法:-)

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

Scheme或Erlang等函数式编程语言也允许您声明变量,在Haskell中您也可以这样做:

--函数“test”接受变量x并将其添加到列表xs的每个元素上

test :: [Int] -> [Int]
test xs = map (+ x) xs
where x = 2

fwiw这也可以通过扩展在.NET中实现,而且imho没有那么优雅,XSLT中的函数编程不需要扩展,Jeni很清楚这一点:.FXSL——XSLT的函数编程库已经存在了8年多。它完全是用XSLT本身编写的。几乎完全实现了Haskell Prelude函数。在XPath 3.0或3.1附带的XSLT 3.0中,函数现在是一级公民,可以作为项传递或调用等。不再需要扩展。是的,XSL让您设置一个变量,但它是不可变的。您说得对!我在这一点上得到了纠正。感谢您提醒我们注意它。一旦您设置了变量XSLT中的值您无法更改它。有一次,当我忘记/忽略这一点时,我实际上遇到了一点问题。您知道,我认为他们应该在语言本身中更明确地说明这一点,因为我相信您和我不是唯一陷入这一困境的人。
让我想到了一些变化的东西(在运行时)-
会更准确。事实上,我记得我使用XSLT的经历很尴尬,特别是因为我希望它的行为方式与实际情况不符,这与Java程序员第一次使用Javascript时的感觉非常相似。@CamiloMartin,它被称为变量,因为它可能会根据不同的语言而有所不同
select
-表达式或包含的
序列构造函数的上下文。一个常量在整个程序中都是相同的。这里的混淆是不能在同一范围内重新分配变量。但是它的值肯定是可变的,因此它的名称也是可变的。相反的情况是:XSLT没有c的概念onstants(这在XSLT3.0中发生了变化)。@Abel四年多后,但我仍然觉得XSLT令人难以置信。这就像有人设计了一艘太空船来割草一样