2016-11-20 7 views
2

スキームで(((lambda(x y) (lambda (x) (* x y))) 5 6) 10)を評価してください。Schemeのネストされたラムダ?

私は実際にこれを行う方法がわかりません!

((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

例えばラムダさもなければ閉鎖として知られている - 新しい値x=5y=6は、その定義環境で囲まありますあなたの質問を完全に変更しないでください。それは人々が書く時間を取った答えを無効にします。新しい質問がある場合は、新しい質問をしてください。 –

答えて

1

(lambda(x y) (lambda (x) (* x y)))から始めましょう。これは、2つのパラメータを取り、別の関数式を返す関数式です。便宜上、式全体をfと呼びます。

(f 5 6)を検討してください。これにより、渡された値にバインドされたyを持つ別のラムダ(lambda (x) (* x y)が返されます。ただし、内部のxパラメータは外側のパラメータをシャドウするため、結果は(f 5 6) = (lambda (x) (* x 6)になります。

ここから、((lambda (x) (* x 6)) 10)を直接評価することができます。これにより最終結果は60になります。

+0

No. 10は、((λ(x y)...)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)) 
に評価 y6にバインドされているので

です。
外側ラムダ(5にバインドされている)からのxは使用されないことに注意してください。

この機能は、その後60を得

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

を適用しています。

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

参照してくださいますか?外側のラムダを引数5と6に適用した結果、内側のラムダはの値として返されます。それは次に10に印加される

enter image description here

(((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 
関連する問題