2016-11-06 9 views
0

Ich habe ein paar Zeilen Code in meinen Hausaufgaben:Warum verwenden wir verschachtelte Lambdas im Schema?

(define square-a-procedure 
(lambda (f) (lambda (x) (square (f x))))) 

Ich verstehe nicht, warum ich das nicht schreiben kann als

(define square-a-procedure (lambda (f x) (square (f x)))) 

Ich weiß, es über Typen, aber ich don‘ t bekommen wir wirklich, warum wir Parameter nacheinander nehmen, anstatt alle auf einmal zu nehmen.

Antwort

1

Beide Versionen arbeiten mit dem gleichen Ergebnis, aber eine gibt eine Teilanwendung zurück, die Sie wie in Funktionen höherer Ordnung verwenden können. Stellen Sie sich vor, Sie möchten eine Konstante hinzufügen und die Elemente in einer Liste quadrieren. Wir konnten Benutzer Ihre erste Version mit Leichtigkeit:

(define (add4 n) 
    (+ n 4)) 

(map add-4-and-square 
    (square-a-procedure add4) 
    '(0 1 2 3))    ; ==> (16 25 36 49) 

Mit Ihrer zweiten wir nicht tun könnten, wenn wir wickelte ihn in einem Lambda, die tatsächlich tat genau das gleiche wie die erste. Sehr oft machen wir teilweise Anwendung ohne zu denken:

(map (lambda (n) (+ n 4)) '(1 2 3)) ; ==> (5 6 7) 
0

Wenn wir zwei Parameter auf einmal nehmen, sind wir gezwungen, die beiden zum selben Zeitpunkt zu nehmen. Also muss ein Benutzer unserer Funktion beide Argumente gleichzeitig angeben.

Wenn wir Parameter einzeln nehmen, können wir sie zu zwei verschiedenen Zeitpunkten erhalten. So kann ein Benutzer unserer Funktion jedes Argument für die Funktion separat angeben. Dies ist flexibler. Da Scheme lexikalischen Geltungsbereich hat, "erinnert" sich das innere Lambda, das von dem äußeren Aufruf zurückgegeben wird, an das Argument, das bei seiner Erstellung verwendet wurde. Dies ist, was Verschlüsse sind, und dies ermöglicht die Modellierung von Objekte in unserem Code.