Clojure.
(defn concat-inner-seqs "concat inner sequencies in sequence of tuples" [seq-of-seqs] (apply (partial map concat) seq-of-seqs)) (println (concat-inner-seqs [[[1] [2] [:a]] [[3] [4] [:b]] [[5] [6] [:c]]])) ; ((1 3 5) (2 4 6) (:a :b :c))А теперь вот это придется объяснить всем заинтересованным сотрудникам.
PS: Версия с мапами вместо туплов:
(defn concat-maps-seq "concat inner sequencies in sequence of maps" [seq-of-maps] (apply (partial merge-with concat) seq-of-maps)) (def test-data-maps [ {:F1 [1 "b" "3"] :F2 [2 'aa] :F3 [:a :e] :F4 [3333]} {:F1 [3] :F4 [4] :F6 [:b] :Pauk "abc"} {:F1 [5] :F3 [6] :F2 [:c] :Pauk "def"} ]) (println test-data-maps) (println (concat-maps-seq test-data-maps))
Сделана заменой map на merge-with. Можно использовать именованные поля и разное их количество.
no subject
no subject
no subject
no subject
Только сегодня придумал как идиоматически обобщить это дело.
no subject
no subject
Т.е. структура данных тут не совсем матрица, а "последовательность туплов/мапов с последовательностями в качестве значений полей".
no subject
(map concat [[1] [2] [:a]]
[[3] [4] [:b]]
[[5] [6] [:c]])
Даёт тот же результат, а в функции требует apply (partial *)
no subject
Поэтому я использую (apply fn seq) а fn создаю с помощью частичного применения map concat
no subject
no subject
Вот если я найду целый класс функций типа map и merge-with и пойму, что в них общего и чем они мне будут полезны в опердени - тогда обобщу. Но частные реализации все равно оставлю - они нужны чаще всего.
no subject
no subject
Получается трэшатина типа коммон-лисповых caaaddddr
no subject
(defn transpose [m] (apply (partial map list) m))
no subject
интересненько. Значит общность с транспонированием действительно имеется.
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
no subject
Весной еще Хаскель и проект по нему были, тоже от лябмды.
no subject
no subject
no subject
no subject
no subject
Транспонирование здесь совершенно логичное следствие зипования.
no subject
no subject
По-моему, это не хак, а идиоматически правильный способ.
no subject
no subject
no subject
Осталось заставить прочесть :)
no subject
no subject
no subject
no subject