2012-05-23 30 views
5

bu Clojure makyaj toplayıcı örneği anlayamıyorum, ama aşağıdaki temel örnekle bir tuğla duvara çarptı:Ben Clojure üzerinde biraz yukarı okumaya çalışıyorum

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

anlamıyorum ne add2, sayı 4'ü make-adder işlevine nasıl geçirir ve bu işlev dönüşü bu sayıyı z olarak atar.

Şimdiden teşekkürler!

cevap

6

make-adder, bir parametre (z) alan bir işlev döndürür; y'ye bir değer atamak için make-adder'a iletilen parametre kullanılır. add2 (y make-adder gelen parametreye atanan çünkü) make-adder, dönen işlevine eşit olacak şekilde set görünüyor Yani 2. add2 bir parametreyle make-adder değerlendirilmesi sonucu eşit ayarlanır

(fn [z] (+ 2 z)) 

gibi Yani (add2 4), bu işlevi 6 olarak değerlendirir. Bu yardımcı olur mu?

+0

Mükemmel! Evet yardımcı olur! Çok teşekkürler! – Deleteman

+1

İhtiyacım bile gerekli olduğunu sanmıyorum sadece kodu zorlaştırıyor – Kevin

+0

@Kevin: Doğru, burada yararlı değil. –

3

Bana göre, ilginç bir problem üzerinde çalışıyorsunuz. (Izin bağlama olmadan yeniden yazılabilir)

Kişisel örnek yapmak-toplayıcı fonksiyonu

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

yapmak-toplayıcı zaten bir değerle adı edilmiş olan x ve z, toplayan bir fonksiyonu döndürür. Örneğinizin Clojure kısmi fonksiyonunu uyguladığına inanıyorum, ki bu oldukça havalı. İşte

bir işlev döndürecek (yani biz Add2 kısmi kullanabilirsiniz) onun iki parametre toplamı değil, yeniden yazılarak senin makyaj toplayıcı işlevi,

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

ve burada 2 gibi kısmi kullanılarak ADD2 yeniden yazılırsa x parametresi:

(def add2 (partial make-adder 2)) 

Cevabın 4, (add2 3) ise (add2 2) diyoruz, bu sorunun cevabı 5 ve böylece açık.

+0

Ekstra açıklama için teşekkürler. Henüz clojure için yeniyim, ve bu yüzden 'parsiyel' kavramı ile aşina değilim. Bu yüzden, örneğini tamamen anlamak benim için biraz zor. – Deleteman

İlgili konular