Я начинаю изучать лямбда-исчисление, и мне нужно внедрить комбинаторы I, S, K в Erlang.
Конечно, S, K, я расшифровывается как:
S = λxyz.xz (yz) K = λxy.x I = λx.x
У меня нет проблем с пониманием I = преобразование SKK на бумаге (как представлено здесь: Чтобы доказать, что SKK и II являются бета-эквивалентом, лямбда-исчисление ), но мне кажется, что я не понимаю, когда оно приходит к функциональным языкам и функциям высокого порядка ...
Мне удалось сделать I и K (скажем, в модуле test
):
i(X) -> X.
k(X) -> fun(Y) -> X end.
Также я знаю, как запустить K x (K x) (SKK x = K x (K x))
kxk(X) -> (k(X))(k(X)).
Но я не могу написать S комбинатор. Я попробовал:
s(X) -> fun (Y) -> fun(Z) -> X,Z (Y,Z) end end.
Но, тем не менее, я не могу преобразовать SKK x в x
Я пытаюсь запустить его так:
skkx(X) -> s((k((k(X))))).
Буду признателен за любую помощь, так как я полностью потерян.