Комбинатор S в Erlang

Я начинаю учиться лямбда-исчисление, и мне нужно реализовать комбинаторы I, S, K в Erlang. Конечно, S, K, I означает:

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))))).

Любая помощь будет принята с благодарностью, так как я полностью потерялся.

5
задан Paul Sweatte 8 June 2017 в 18:09
поделиться