Clojure: вариационная функция для сложения векторов

Я хочу написать общую функцию для добавления векторов:

С картой я могу сделать следующее:

(vec (map + [1 2] [1 2] [1 2]))
⇒ [3 6]

(vec (map + [1 2 3] [1 2 3] [1 2 3]))
⇒ [3 6 9]

Я хотел бы иметь возможность обернуть его в функцию, которая принимает любое количество векторов. В настоящее время у меня есть версия, которая работает с использованием цикла и повторения:

(defn add-coords [& args]
  (loop [coords (first args) more (rest args)]
    (if (empty? more)
      (vec coords)
      (recur (map + coords (first more))
             (rest more)))))

(add-coords [1 2] [1 2] [1 2])
⇒ [3 6]

(add-coords [1 2 3] [1 2 3] [1 2 3])
⇒ [3 6 9]

Есть ли способ сделать это в одну строку? Что-то типа:

(defn add-coords [& args] (vec (map + args)))

person user619882    schedule 20.04.2015    source источник


Ответы (1)


apply mapv должно помочь:

user=> (defn add-coords [& args] 
         (when (seq args) 
           (apply mapv + args)))

в действии

user=> (add-coords [1 2 3] [1 2 3] [1 2 3])
[3 6 9]
person tolitius    schedule 20.04.2015