Kro*_*dak 5 erlang lambda lambda-calculus s-combinator
我开始学习lambda演算,我需要在Erlang中实现I,S,K组合器.当然,S,K,我代表:
S =λxyz.xz(yz)K =λxy.xI=λx.x
我在纸上理解I = SKK转换没有问题(如此处所示:为了证明SKK和II是beta等价的,lambda演算)但似乎在功能语言和高阶函数时我不理解它. ..
我设法做了我和K(让我们说在模块中test
):
i(X) -> X.
k(X) -> fun(Y) -> X end.
Run Code Online (Sandbox Code Playgroud)
我也知道如何运行K x(K x)(SKK x = K x(K x))
kxk(X) -> (k(X))(k(X)).
Run Code Online (Sandbox Code Playgroud)
但我无法理解它编写S组合器.我试过了:
s(X) -> fun (Y) -> fun(Z) -> X,Z (Y,Z) end end.
Run Code Online (Sandbox Code Playgroud)
但是,我仍然无法将SKK x转换为x
我尝试像这样运行它:
skkx(X) -> s((k((k(X))))).
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激,因为我完全迷失了.
从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
Run Code Online (Sandbox Code Playgroud)
或者作为模块中的函数:
i(X) -> X.
k(X) -> fun(Y) -> X end.
s(X) -> fun (Y) -> fun (Z) -> (X(Z))(Y(Z)) end end.
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
559 次 |
最近记录: |