如何按类型合并Clojure列表中的项目?

时间:2019-06-13 04:10:24

标签: clojure

我正在尝试按项目的数据类型合并Clojure列表中的项目。

我尝试使用conjmergeinto合并项目。但是,当列表项具有相同的数据类型时,它们似乎可以完美地工作。

(def args '({:a 1} "Heading"))
(def args2 ({:b 2}))
(conj args args2)

我得到的输出是({:b 2} {:a 1} "Heading")。相反,我想实现({:b 2 :a 1} "Heading")

1 个答案:

答案 0 :(得分:6)

这有点复杂,但是由于您要求灵活性,所以您可以进行以下操作:

(defmulti conjoin first)

(defmethod conjoin :default [[k v]] v)
(defmethod conjoin (class {}) [[k v]] [(apply merge v)])
(defmethod conjoin (class []) [[k v]] [(vec (apply concat v))])

(let [a '({:a 1} "Heading" [a])
      b '({:b 2} "Fake" [b])]
    (->> (concat a b)
         (group-by class)
         (mapcat conjoin)))
=> ({:a 1, :b 2} "Heading" "Fake" [a b])