6

私はラムダ計算を学び始めており、Erlang で I、S、K コンビネータを実装する必要があります。もちろん、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))))).

私は完全に迷っているので、助けていただければ幸いです。

4

1 に答える 1

7

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.
于 2011-10-17T09:18:47.150 に答える