5 Stimmen

Ich kann dieses Clojure make-adder Beispiel nicht verstehen

Ich versuche, ein wenig über Clojure zu lesen, aber ich treffe auf eine Mauer mit dem folgenden einfachen Beispiel:

(defn make-adder [x]
  (let [y x]
    (fn [z] (+ y z))))
(def add2 (make-adder 2))
(add2 4)
-> 6

Was ich nicht verstehe, ist, wie ist add2 Übergabe der Zahl 4 an die Funktion make-adder, und wie ordnet diese Funktion wiederum diese Zahl z zu.

Vielen Dank im Voraus!

7voto

Nathan Hughes Punkte 90344

make-adder gibt eine Funktion zurück, die einen Parameter (z) benötigt, den Parameter, der an make-adder wird verwendet, um y einen Wert zuzuweisen. add2 wird gleich dem Ergebnis der Auswertung von make-adder mit einem Parameter von 2. Also add2 wird gleich der Funktion gesetzt, die von make-adder , die (da y dem Parameter aus make-adder ) sieht aus wie

(fn [z] (+ 2 z))

Also (add2 4) ruft diese Funktion auf, die zu 6 ausgewertet wird. Ist das hilfreich?

3voto

octopusgrabbus Punkte 10210

Ich habe den Eindruck, dass Sie an einem interessanten Problem arbeiten.

Ihre Beispielfunktion make-adder (umgeschrieben ohne let-Bindungen)

(defn make-adder [x]
  "Returns a function that returns the sum of x and yet to be supplied z."
  (fn [z] (+ z x))))

gibt eine Funktion zurück, die x und z summiert, wobei make-adder bereits mit einem Wert aufgerufen worden sein muss. Ich glaube, Ihr Beispiel implementiert die Clojure-Teilfunktion, die ziemlich cool ist.

Hier ist Ihre make-adder-Funktion so umgeschrieben, dass sie ihre beiden Parameter addiert und keine Funktion zurückgibt (so dass wir partial in add2 verwenden können),

(defn make-adder
  "Returns sum of x and y." 
  [x y] 
  (+ x y))

und hier ist add2 umgeschrieben unter Verwendung von partial mit 2 als x-Parameter:

(def add2 (partial make-adder 2))

Wenn ich anrufe (add2 2) die Antwort lautet 4, (add2 3) ist die Antwort 5 und so weiter.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X