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

如何按类型合并clojure列表中的项?,clojure,Clojure,我正在尝试按项目的数据类型合并Clojure列表中的项目 我尝试使用conj,合并,合并到来合并项目。但是,当列表项具有相同的数据类型时,它们似乎可以完美地工作 (def args'({:a 1}“标题”)) (def args2({:b2})) (联合args args2) 我得到的输出是({:b2}{:a1}“标题”)。相反,我希望实现({:b2:a1}“Heading”)这有点复杂,但既然您要求灵活性,那么您就可以: (defmulti conjoin first) (defmetho

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

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

(def args'({:a 1}“标题”))
(def args2({:b2}))
(联合args args2)

我得到的输出是
({:b2}{:a1}“标题”)
。相反,我希望实现
({:b2:a1}“Heading”)

这有点复杂,但既然您要求灵活性,那么您就可以:

(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])

如果两个输入都包含一个字符串怎么办?对于我的特定情况,有多个字符串,它们是列表的一部分。最终结果可能看起来像
({:b2:a1}“标题1”或“标题2”)
。但如果我能具体说明我是否想做,那就太好了。非常感谢。这看起来非常干净,适合未来的用例。在将其移植到我自己的用例中之后,我更加意识到了这一点。尽管这在Clojure中非常有效。但是当我开始在ClojureScript中使用它时,我得到了错误
使用未声明的Var ad.base.typography/class
。我将
方法修改为
类型
,工作起来非常轻松。