將值列表連接到地圖值的習慣用法是什麼?將值列表連接到Clojure中的地圖值?
這是我想要的結果,但匿名函數看起來很醜陋imo。有沒有更好的辦法?
> (update-in {:x #{}} [:x] #(apply conj % '(1 2)))
{:x #{1 2}}
將值列表連接到地圖值的習慣用法是什麼?將值列表連接到Clojure中的地圖值?
這是我想要的結果,但匿名函數看起來很醜陋imo。有沒有更好的辦法?
> (update-in {:x #{}} [:x] #(apply conj % '(1 2)))
{:x #{1 2}}
匿名函數是不必要的
(update-in {:x #{}} [:x] conj 1 2)
;=> {:x #{1 2}}
(update-in {:x #{}} [:x] into [1 2])
;=> {:x #{1 2}}
另一個選項是'(update-in {:x#{}} [:x] clojure.set/union#{1 2})''。我更喜歡這一個,因爲意圖更明確(將元素添加到集合中)。 –
我把這個問題看作是通用的,一個集合只是一個示例集合,但是肯定。 –
你不應該知道地圖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。 (警告:類型僅在其中一種算法中起作用,否則就會妨礙它)。
另外,使用矢量('[1 2]')通常比引用列表(''1 2'''''''''''''''' '(1 2)')爲文字序列,因爲它的內容得到評估。 – Alex