2014-01-16 84 views
1
=> (into {} (for [x [["1" "2"] ["3" "4"]]] (map #(Long/parseLong %) x))) 
ClassCastException java.lang.Long cannot be cast to java.util.Map$Entry clojure.lang.ATransientMap.conj (ATransientMap.java:44) 

=> (into {} (for [x [["1" "2"] ["3" "4"]]] (seq (map #(Long/parseLong %) x)))) 
ClassCastException java.lang.Long cannot be cast to java.util.Map$Entry clojure.lang.ATransientMap.conj (ATransientMap.java:44) 

=> (into {} (for [x [["1" "2"] ["3" "4"]]] (vec (map #(Long/parseLong %) x)))) 
{1 2, 3 4} 

我有兩個相關的問題序列爲X序列:爲什麼不(成{} X)接受

  1. 爲什麼(into {})矢量堅持作爲一個容器(關鍵,價值)對?
  2. 爲什麼它試圖使用Long作爲配對的組成部分?它不應該至少抱怨看到一個非矢量,不管它包含什麼?

使用Clojure 1.5.1 BTW測試。

回答

3

要回答第二個問題:你要傳遞一個序列序列到intointo重複conj ing(或conj! ing,如果可能的話,結果是等價的)。在這裏,在每一步中,您將從您的序列序列中選取一個項目,然後將其添加到地圖上。每個這樣的項目是兩個序列的兩個Long。當您在地圖上的conj序列中,conj假定它是一系列地圖條目並將每個元素轉換爲Map$Entry。 所以,在這裏它會試圖將您的Long s投射到Map$Entry

+0

這實際上也回答了第一個問題。 –

3

intoconj之上實施。

(into {} ...) ;; equivalent to (below) 
(-> {} 
    (conj (map #(Long/parseLong %) ["1" "2"]) ;; produces the same exception 
    (conj (map #(Long/parseLong %) ["3" "4"])) 

conj需要映射,映射條目或雙元素向量。從http://clojure.org/data_structures#toc17考慮這個摘錄:

連詞期望另一個(可能是單次入境)地圖作爲該項目,並返回一個新的地圖是老地圖加上新的條目,這可能會覆蓋舊的條目。 conj還接受MapEntry或兩個項目(鍵和值)的向量。