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.
Другие вопросы по тегам