Как объединить элементы в списке clojure по типам? - PullRequest
2 голосов
/ 13 июня 2019

Я пытаюсь объединить элементы в списке 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").

1 Ответ

6 голосов
/ 13 июня 2019

Это немного сложно, но так как вы попросили о гибкости, вы идете:

(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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...