2014-07-18 139 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。 (警告:类型仅在其中一种算法中起作用,否则就会妨碍它)。