Я начинаю учиться лямбда-исчисление, и мне нужно реализовать комбинаторы 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))))).
Любая помощь будет принята с благодарностью, так как я полностью потерялся.