다음 Prolog 코드를 직면하고 있습니다. [X] >> Y 표현식은 람다 식 λ X.Y에 대해 입니다. 이 코드는 람다 을 제거하고 S를 통해 조합 적 표현을 제공, K와 나는 :SKI 변환, 함수 언어로 프로그래밍하는 방법
?- convert([X]>>([Y]>>apply(Y,X)),R).
R = apply(apply('S', apply(apply('S', apply('K', 'S')),
apply('K', 'I'))), apply(apply('S', apply('K', 'K')), 'I'))
은 가정하자 나도 같은 변환 코드 싶습니다 : 여기
convert([X]>>Y,'I') :- X==Y, !. convert([X]>>Y,apply('K',Y)) :- var(Y), !. convert([X]>>([Y]>>Z),R) :- convert([Y]>>Z,H), convert([X]>>H,R). convert([X]>>apply(Y,Z),apply(apply('S',S),T)) :- convert([X]>>Y,S), convert([X]>>Z,T). convert([_]>>Y,apply('K',Y)).
어떻게 작동하는지 예입니다 Haskell, ML 또는 에있는 등. 어떻게해야합니까? 함수 프로그래밍 언어에서 직접 사용할 수있는 λ 식을 으로 사용할 수 있습니까? 아니면 일부 메타 프로그래밍 시설에 회귀해야합니까?
안부
P.S : 위의 코드는 매우 짧은 스키 표현에 이르게 SKI 변환되지 않습니다. 의 발생을 람다 식 본문의 바운드 변수로 검사하는 더 나은 코드가 가능합니다.
이 질문을 게시 한 후 다음과 같은 흥미로운 문서를 발견했습니다. http://www.stanford.edu/class/cs242/readings /backus.pdf. 나는 전환의 목적을 위해 FFP (정식 기능 언어)가 필요하다고 결론을 내린다. 그래서 진짜 FFP가 일어서기를 바랍니다! –
지금까지의 답변과 의견에서, 하스켈은 ML이 완벽하게 FFP를 통합하지 않는다고 결론을 내립니다. 그리고 다른 한편으로는 Lisp, Scheme, etc.은 FFP를 완벽하게 통합합니다. 이음매없는 FFP가있을 때 Lisp와 비슷하다고 말할 수 있습니까? 아니면 세 번째 옵션이 있습니까? –