2014-07-18 111 views
3

將值列表連接到地圖值的習慣用法是什麼?將值列表連接到Clojure中的地圖值?

這是我想要的結果,但匿名函數看起來很醜陋imo。有沒有更好的辦法?

> (update-in {:x #{}} [:x] #(apply conj % '(1 2))) 
{:x #{1 2}} 
+2

另外,使用矢量('[1 2]')通常比引用列表(''1 2'''''''''''''''' '(1 2)')爲文字序列,因爲它的內容得到評估。 – Alex

回答

4

匿名函數是不必要的

(update-in {:x #{}} [:x] conj 1 2) 
;=> {:x #{1 2}} 

(update-in {:x #{}} [:x] into [1 2]) 
;=> {:x #{1 2}} 
+0

另一個選項是'(update-in {:x#{}} [:x] clojure.set/union#{1 2})''。我更喜歡這一個,因爲意圖更明確(將元素添加到集合中)。 –

+0

我把這個問題看作是通用的,一個集合只是一個示例集合,但是肯定。 –

0

你不應該知道地圖contains?鍵是否你是conj ING值。調整您的示例...

(update-in {} [:x] #(apply conj % '(1 2))) 
;{:x (2 1)} 

...不是你想要的。

以下

(defn assocs [m k coll] 
    (assoc m k (into (get m k #{}) coll))) 

...如果存在該鍵的條目提供一個空設定值。

(assocs {} :x [1 2]) 
;{:x #{1 2}} 

(assocs {:x #{2}} :x [1 2]) 
;{:x #{1 2}} 

你會在clojure.algo.graph找到類似的代碼,例如here。 (警告:類型僅在其中一種算法中起作用,否則就會妨礙它)。