Является ли XSLT функциональным языком программирования?

StackOverflow https://stackoverflow.com/questions/110031

Вопрос

Несколько вопросов о функциональных языках программирования заставили меня задуматься о том, является ли XSLT функциональным языком программирования.Если нет, то какие функции отсутствуют?XSLT 2.0 сократил или закрыл этот разрыв?

Это было полезно?

Решение

XSLT является декларативным, а не сохраняющим состояние.

Хотя XSLT основан на идеях функционального программирования, он не является полноценным функциональным языком программирования, ему не хватает возможности рассматривать функции как первоклассный тип данных.В нем есть такие элементы, как отложенное вычисление, позволяющее уменьшить количество ненужных вычислений, а также отсутствие явных циклов.

Однако, как и в случае с функциональным языком, я думаю, что его можно хорошо распараллелить с помощью автоматической безопасной многопоточности на нескольких процессорах.

От Википедия на XSLT:

Как язык, XSLT влияет на функциональные языки, а также языки сопоставления текстовых шаблонов, такие как Snobol и Awk.Его самым прямым предшественником был DSSSL, язык, который выполнял ту же функцию для SGML, которую XSLT выполняет для XML.XSLT также может рассматриваться как процессор шаблона.

Вот отличный сайт по использованию XSLT как функциональный язык с помощью FXSL.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 будет действительно очень незнакомым, чуждым ландшафтом.По крайней мере, поначалу.Приобретение небольшого опыта и последующее возвращение к XSLT, когда выражения XPath и обработка событий станут для вас действительно удобными, окупятся сторицей.

По большей части то, что делает 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() звонки.

На самом деле это не аргумент, поскольку вы можете только объявлять переменные, но не изменять их значения после объявления.В этом смысле это декларативный, а не императивный стиль, как сказано в статье господина Новатчева.

Языки функционального программирования, такие как Scheme или Erlang, также позволяют вам объявлять переменные, и в Haskell вы также можете это делать:

-- функция test принимает переменную x и добавляет ее к каждому элементу списка xs

test :: [Int] -> [Int]
test xs = map (+ x) xs
where x = 2
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top