2016-11-20 58 views
2

在Scheme中評估(((lambda(x y) (lambda (x) (* x y))) 5 6) 10)Scheme中嵌套的Lambda?

我不知道該怎麼做到這一點!

((lambda (x y) (+ x x y)) 3 5) 

相當簡單。這裏x = 3,y = 5。

但在這個身體是:(lambda (x) (* x y))) 5 6)和參數是10

那麼我們分別評估?如在(lambda (x) (* x y))) 5 6) = (* 5 y)然後(((lambda(x y) (lambda (x) (* x y))) 5 6) 10) = (((lambda (x y) (* 5 y) 10))

但是,如何評估?

+0

請不要完全改變你的問題。這使人們花時間寫的答案無效。如果您有新問題,請提出一個新問題。 –

回答

1

讓我們從(lambda(x y) (lambda (x) (* x y)))開始。這是一個函數表達式,它接受兩個參數並返回另一個函數表達式。爲了方便起見,我將整個表達式稱爲f。現在考慮(f 5 6)。這會返回另一個lambda,(lambda (x) (* x y),y與傳入的值綁定。但是,內部x參數會影響外部參數,所以結果爲(f 5 6) = (lambda (x) (* x 6)

從這裏,我們可以直接評估((lambda (x) (* x 6)) 10)。這產生了60的最終結果。

+0

No. 10應用於((lambda(xy)...)5 6)的結果。仔細查看括號(或者使用能夠向你展示配對的編輯器)。 – andars

2

如果重命名在內部拉姆達參數更容易:

(((lambda (x y) (lambda (z) (* z y))) 5 6) 10) 

外拉姆達被施加到圖5和6:

((lambda (x y) (lambda (z) (* z y))) 5 6) 

此計算結果爲

(lambda (z) (* z 6)) 

因爲y綁定到6
請注意,x從外部lambda(這是綁定到5)從未使用。

該函數然後被施加

((lambda (z) (* z 6)) 10) 

這產生60

1
(((lambda (x y) (lambda (x) (* x y))) 5 6) 10) 

( ( (lambda (x y) 
     (lambda (x) (* x y)) 
     ) 
     5 
     6) 
    10) 

enter image description here

看到了嗎?作爲將外部lambda應用於參數5和6的結果,內部lambda返回值爲。新值在其定義的環境,在那裏x=5y=6封閉 - 這樣的λ另外稱爲閉合

enter image description here

它然後被施加到10:

(((lambda (x y) (lambda (x) (* x y))) 5 6) 10) 

= ((let ((x 5) 
      (y 6)) 
     (lambda (x) (* x y))) 
    10) 

= (let ((x 5) 
     (y 6)) 
    ((lambda (x) (* x y)) 
     10)) 

= (let ((x 5) 
     (y 6)) 
     (let ((x 10)) 
      (* x y))) 

=   (* 10 6) 

=   60