Идиоматический способ суммирования нескольких векторов в Clojure - PullRequest
2 голосов
/ 08 февраля 2012

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

=>(def collated-list [2 3 4 5 6 7 8])
=>(def lists-to-add (partition-all 3 collatedlist))
=>(def base-list [1 1 1])

Я бы хотел, чтобы результат суммировал разбитые разборные списки на base-list, например, первый элемент будет 1 + 2 + 5 + 8 и т. Д.

То, что я пробовал: Я пробовал цикл map и for несколькими способами, но я, похоже, столкнулся с проблемами с Lazy Sequencing или с попытками добавления от Integer до Vector.

Это мои первые эксперименты с Clojure, так что это почти наверняка неправильное понимание функциональной итерации здесь.

Спасибо

Ответы [ 2 ]

4 голосов
/ 08 февраля 2012

Прежде всего, будет намного проще, если списки для добавления содержат списки четной длины, поэтому используйте partition вместо partition-all:

(def lists-to-add (partition 3 3 '(0 0) collated-list))

И затем вы можете сделать суммирование с помощью map и рекурсии:

(defn sum-lists [base-lists lists-to-add]
    (reduce #(map + %1 %2) base-list lists-to-add))
0 голосов
/ 08 февраля 2012
; List of list
(def lst (partition 5 (range 200)))

; Base list
(def base [1 1 1 1 1])

; Sum operation
(apply map (fn [& args] (apply + args) ) base lst)
...