2011-06-01 20 views
11
I Clojure öğreniyorum

parseInt harita çalışırken ve bir şüphem: BenGarip hata olduğunda Clojure

(map vector '("1" "2" "3")) 

yazdığınızda alıyorum Neden

(["1"] ["2"] ["3"])

Tamam vector çünkü bir işlev (veya neredeyse sanırım) ve (vector "3") yapabilir ve ["3"] alabilirsiniz.

Şimdiye kadar iyi

ama

(map Integer/parseInt '("1" "2" "3")) 

çalıştığımda bir hata alıyorum. parseInt, bir işlev gibi davranmamalı mı?

Sonra

(map #(Integer/parseInt %) '(...... 

Neden bir işlev gibi parseInt kullanamaz

yazmanız gerekir? Benim için ... bu bir fonksiyon var ve bunu ben biraz tutarsız hissediyorum, ama bazı hata yapmaktan ve bunu sormak bu içindir eminim

(Integer/parseInt "3") 

gibi kullanabilirsiniz

+0

olası yinelenen için çalışacak (http : //stackoverflow.com/questions/4714923/convert-a-sequence-of-strings-to-integers-clojure) – amalloy

cevap

16

#() veya (fn ...) içine sarmanız gerekir. Bunun nedeni, Tamsayı/parseInt bir Java yöntemidir ve Java yöntemleri etrafından geçirilemez. IFn arayüzünü uygulamıyorlar.

Clojure, Java üzerinde oluşturulmuştur ve bazen bu durumdan sızar ve bu da bu durumlardan biridir.

(map #(Integer/parseInt %) '("1" "2" "3")) 

Bunun nedeni Clojure fonksiyonları IFN arabirimini uygulamak gerektiğidir: Diğerleri belirttiğimiz gibi

+0

çok teşekkür ederim .. Benim için açık: D – coco

4

, bir Clojure işlevi içine bir Java yönteminden dönüştürmek amacıyla tamsayı/parseInt sarmak gerekiyor argüman olarak map gibi daha yüksek mertebeden işlevlere geçirilmek için.

dönüşüm defalarca bu tür yapıyorsanız, bu biraz çirkin, bu yüzden aşağıdaki gibi ayrıştırma-int fonksiyonunu sarma öneriyoruz:

son alternatif olarak
(defn parse-int [s] (Integer/parseInt s)) 

(map parse-int '("1" "2" "3")) 

, sen isteyebilirsiniz yerleşik salt dize işlevini kullanmak - Bu durumda tamsayılar dönecektir değil, aynı zamanda çiftlerde vb .: [tamsayılar (Clojure) için dizeleri bir diziyi dönüştürme] arasında

(map read-string '("1" "2" "3")) 
+0

çok teşekkürler ... Anlaşıldı bana: D – coco