S комбинатор в Эрланге - PullRequest
       16

S комбинатор в Эрланге

5 голосов
/ 17 октября 2011

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

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

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

1 Ответ

6 голосов
/ 17 октября 2011

Из оболочки 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.
...