在Clojure中将值列表与地图值相结合?

时间:2014-07-18 14:34:16

标签: clojure

将值列表与地图值相结合的惯用方法是什么?

这是我想要的结果,但匿名函数看起来很丑陋。还有更好的方法吗?

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

2 个答案:

答案 0 :(得分:4)

匿名功能是不必要的

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

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

答案 1 :(得分:0)

您不必知道地图contains?是否为您conj值的关键字。调整你的例子......

(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。 (警告:graph类型仅在其中一种算法中起作用,否则只会阻碍。)