문제

함수형 프로그래밍 언어에 대한 몇 가지 질문으로 인해 XSLT가 함수형 프로그래밍 언어인지 생각하게 되었습니다.그렇지 않다면 어떤 기능이 빠졌나요?XSLT 2.0이 격차를 줄였나요, 아니면 좁혔나요?

도움이 되었습니까?

해결책

XSLT는 상태 저장과 달리 선언적입니다.

XSLT는 함수형 프로그래밍 아이디어를 기반으로 하지만 완전한 함수형 프로그래밍 언어는 아니며 함수를 첫 번째 클래스 데이터 유형으로 처리하는 기능이 부족합니다.불필요한 평가를 줄이고 명시적인 루프가 없기 때문에 지연 평가와 같은 요소가 있습니다.

하지만 기능적 언어와 마찬가지로 여러 프로세서에 걸쳐 자동 안전 멀티스레딩을 사용하면 훌륭하게 병렬화할 수 있다고 생각합니다.

에서 XSLT의 위키피디아:

언어로서 XSLT는 기능 언어와 Snobol 및 Awk와 같은 텍스트 기반 패턴 일치 언어에 의해 영향을받습니다.가장 직접적인 전임자는 XSLT가 XML에 대해 수행하는 SGML에 대해 동일한 기능을 수행하는 언어 인 DSSSL입니다.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 자체에 대한 경험과 마찬가지로 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top