2012-05-23 21 views
5

próbuję przeczytać trochę o Clojure, ale uderzył w mur z następującym prostym przykładzie:Nie można zrozumieć ten przykład clojure make-adder

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

Co ja nie rozumiem jest jak jest add2 przekazując numer 4 do funkcji make-sumatora i jak robi w tej turze funkcja przypisuje tę liczbę z.

Z góry dziękuję!

Odpowiedz

6

zwraca funkcję, która przyjmuje jeden parametr (z), parametr przekazany do make-adder służy do przypisania wartości y. add2 ustawiony jest równa wynikowi oceny make-adder z parametrem 2. Aby add2 ustawiony jest równa funkcji wrócił z make-adder, która (y ponieważ został przypisany do parametru z make-adder) wygląda

(fn [z] (+ 2 z)) 

Tak więc (add2 4) wywołuje tę funkcję, która ocenia wartość 6. Czy to pomaga?

+0

Perfect! Tak, to pomaga! Wielkie dzięki! – Deleteman

+1

Nie sądzę Let jest nawet potrzebne to tylko komplikuje kod – Kevin

+0

@Kevin: rację, niech nie ma tu przydatny. –

3

Dla mnie wydaje się, że pracujesz na ciekawy problem.

Twój przykład funkcja make-sumator (przepisany bez pozwalają wiązań)

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

zwraca funkcję, która sumuje X i Z, gdzie make-sumator ma już wywołana z wartością. Uważam, że twój przykład implementuje funkcję częściową Clojure, co jest całkiem fajne.

Oto twoja funkcja make-sumator przepisany podsumować swoje dwa parametry, a nie powrót do funkcji (tak, możemy użyć częściowy w ADD2),

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

i tu jest ADD2 zapisane w częściowy z 2 jako parametr x:

(def add2 (partial make-adder 2)) 

Jeśli zadzwonię (add2 2) odpowiedź wynosi 4, (add2 3), odpowiedź brzmi: 5 i tak dalej.

+0

Dzięki za dodatkowe wyjaśnienie. Jestem całkiem nowy w clojure, dlatego nie jestem zaznajomiony z koncepcją "częściową". Dlatego tak trudno mi całkowicie zrozumieć twój przykład. – Deleteman

Powiązane problemy