我开始学习lambda演算,我需要在Erlang中实现I,S,K组合器。
当然,S,K我代表:



我在纸上理解I = SKK转换时没有问题(如此处所示:To prove SKK and II are beta equivalent, lambda calculus),但是当涉及功能语言和高阶函数时,我似乎并不理解...

我设法做到了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))))).

任何帮助将不胜感激,因为我完全迷路了。

最佳答案

从Erlang shell:

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.

关于lambda - Erlang中的S组合器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7790284/

10-12 23:22