S комбинатор в Эрланге
Я начинаю изучать лямбда-исчисление, и мне нужно реализовать I, S, K комбинаторы в Erlang. Конечно, S, K, я расшифровывается как:
S = λxyz.xz (yz) K = λxy.x I = λx.x
У меня нет проблем с пониманием преобразования I=SKK на бумаге (как представлено здесь: чтобы доказать, что SKK и II являются бета-эквивалентом, лямбда-исчислением), но мне кажется, что я не понимаю этого, когда речь идет о функциональных языках и функциях высокого порядка...
Мне удалось сделать я и К (скажем, в модуле 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))))).
Любая помощь будет оценена, так как я полностью потерян.
1 ответ
Из оболочки Erlang:
1> I = fun (X) -> X end.
#Fun<erl_eval.6.80247286>
2> K = fun (X) -> fun (Y) -> X end end.
#Fun<erl_eval.6.80247286>
3> S = fun (X) -> fun (Y) -> fun (Z) -> (X(Z))(Y(Z)) end end end.
#Fun<erl_eval.6.80247286>
4> ((S(K))(K))(42).
42
Или как функции в модуле:
i(X) -> X.
k(X) -> fun(Y) -> X end.
s(X) -> fun (Y) -> fun (Z) -> (X(Z))(Y(Z)) end end.