Я начинаю изучать лямбда-исчисление, и мне нужно реализовать комбинаторы 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.
Но все же я не могу преобразовать СКК х в х
Я пытаюсь запустить это так:
skkx(X) -> s((k((k(X))))).
Любая помощь будет оценена по достоинству, так как я полностью потерян.