2011-10-17 27 views
5

我開始學習lambda微積分,並且需要在Erlang中實現I,S,K組合器。 當然,S,K,I表示:Erlang中的S combinator

S = λxyz.xz(yz) K = λxy.x I = λx.x

我沒有問題,在紙上理解我= SKK轉換(如這裏介紹:To prove SKK and II are beta equivalent, lambda calculus),但它似乎說到我不明白功能性語言和高階功能...

我能夠做到我和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 combinator。我想:

s(X) -> fun (Y) -> fun(Z) -> X,Z (Y,Z) end end. 

但儘管如此,我不能夠SKK X轉換成X

我嘗試這樣運行:

skkx(X) -> s((k((k(X))))). 

任何幫助,將不勝感激,因爲我完全失去了。

+0

事實上,你的問題是純粹的符號上。如果你瞭解beta減少如何工作,那麼你一定理解這個想法。剩下的只是符號。 –

回答

6

從二郎殼:

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. 
+0

好吧,我似乎仍然有一些問題:/ 在我的模塊中我有: i(X) - > X. k(X) - > fun(Y) - > X end。 (X)→fun(Y)→fun(Z)→(X(Z))(Y(Z))end end。 sk(x)→((s(k))(k))(X)。 當我運行(拉馬拉模塊名): 'TPPR:SKK(X).' 我得到: '**異常錯誤:壞函數K 在功能TPPR:' - S/1-樂趣0 - '/ 3' 我錯過了什麼? – Krodak

+0

在您定義的skk(X) - >((s(k))(k))(X)中,寫下了小寫的k - 這是原子'k',而不是函數k/1。如果你改寫skk(X) - >((s(fun k/1))(fun k/1))(X),它應該起作用。 – RichardC

+0

謝謝,是的,情況很糟糕,我必須承認;) – Krodak