我正在尝试按项目的数据类型合并Clojure列表中的项目。
我尝试使用conj
,merge
,into
合并项目。但是,当列表项具有相同的数据类型时,它们似乎可以完美地工作。
(def args '({:a 1} "Heading"))
(def args2 ({:b 2}))
(conj args args2)
我得到的输出是({:b 2} {:a 1} "Heading")
。相反,我想实现({:b 2 :a 1} "Heading")
。
答案 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])