Zaczynam się uczyć rachunku lambda i muszę wdrożyć kombinatory I, S, K w Erlang. Oczywiście, S, K, I oznacza:S kombinator w Erlang
S = λxyz.xz(yz) K = λxy.x I = λx.x
nie mam problemu ze zrozumieniem transformacji I = SKK na papierze (jak przedstawiony tutaj: To prove SKK and II are beta equivalent, lambda calculus), ale wydaje się, że nie rozumiem, jeśli chodzi języków funkcyjnych i funkcji high-order ...
udało mi się zrobić, i i K (powiedzmy w module test
):
i(X) -> X.
k(X) -> fun(Y) -> X end.
także wiem jak uruchomić K x (K x) (SKK x = K x (K x))
kxk(X) -> (k(X))(k(X)).
Ale nie mogę tego zrobić, żeby napisać kombinator S. Próbowałem:
s(X) -> fun (Y) -> fun(Z) -> X,Z (Y,Z) end end.
Ale nadal nie jestem w stanie przekształcić SKK X do X
próbuję uruchomić go tak:
skkx(X) -> s((k((k(X))))).
Każda pomoc będzie mile widziane, jak Jestem całkowicie zagubiony.
Rzeczywiście, problem jest czysto Oznaczenia. Jeśli rozumiesz, jak działa beta-redukcja, to z pewnością rozumiesz ten pomysł. Reszta to po prostu notacja. –