Clojure.

Aug. 3rd, 2012 12:49 pm
metaclass: (Default)
[personal profile] metaclass
(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. Можно использовать именованные поля и разное их количество.

Date: 2012-08-03 10:38 am (UTC)
From: [identity profile] molnij.livejournal.com
капец, я почти понимаю написанное..

Date: 2012-08-03 01:35 pm (UTC)
From: [identity profile] victor bolshakov (from livejournal.com)
Понимать несложно, сложно переключить мышление на другой принцып

Date: 2012-08-03 11:00 am (UTC)
From: [identity profile] blackyblack.livejournal.com
5 минут втыкал.

Date: 2012-08-03 11:04 am (UTC)
From: [identity profile] metaclass.livejournal.com
У меня по какой-то причине необходимость в этих двух функциях в опердени возникает постоянно.
Только сегодня придумал как идиоматически обобщить это дело.

Date: 2012-08-03 11:10 am (UTC)
From: [identity profile] blackyblack.livejournal.com
Я не могу понять, почему она их переворачивает. :) А вообще это называется инвертированием матрицы.

Date: 2012-08-03 11:15 am (UTC)
From: [identity profile] metaclass.livejournal.com
Оно их не переворачивает. Оно вложенные поля-последовательности туплов (или мапов во втором случае) конкатенирует. По всем туплам/мапам из переданной последовательности.
Т.е. структура данных тут не совсем матрица, а "последовательность туплов/мапов с последовательностями в качестве значений полей".

Date: 2012-08-03 11:21 am (UTC)
From: [identity profile] blackyblack.livejournal.com
Я не пойму, почему

(map concat [[1] [2] [:a]]
[[3] [4] [:b]]
[[5] [6] [:c]])

Даёт тот же результат, а в функции требует apply (partial *)

Date: 2012-08-03 11:27 am (UTC)
From: [identity profile] metaclass.livejournal.com
Потому что ты передаешь три параметра (каждый элемент последовательности по отдельности) а мне нужно чтобы на входе был один (последовательность из произвольного количества элементов).

Поэтому я использую (apply fn seq) а fn создаю с помощью частичного применения map concat

Date: 2012-08-03 11:31 am (UTC)
From: [identity profile] blackyblack.livejournal.com
Сделай ещё обобщение этих двух функций. В одну передавай мап, в другую мердж.

Date: 2012-08-03 11:35 am (UTC)
From: [identity profile] metaclass.livejournal.com
Это уже излишество.
Вот если я найду целый класс функций типа map и merge-with и пойму, что в них общего и чем они мне будут полезны в опердени - тогда обобщу. Но частные реализации все равно оставлю - они нужны чаще всего.

Date: 2012-08-03 11:37 am (UTC)
From: [identity profile] blackyblack.livejournal.com
Частные реализуй через обобщенную. Обобщенную назови правильно и станет понятно, что вообще происходит. :)

Date: 2012-08-03 11:38 am (UTC)
From: [identity profile] metaclass.livejournal.com
У меня фантазии для имен долбаных функций и переменных уже не хватает.
Получается трэшатина типа коммон-лисповых caaaddddr

Date: 2012-08-03 11:42 am (UTC)
From: [identity profile] blackyblack.livejournal.com
Вот кстати, из инета:

(defn transpose [m] (apply (partial map list) m))

Date: 2012-08-03 11:50 am (UTC)
From: [identity profile] metaclass.livejournal.com
list на месте concat
интересненько. Значит общность с транспонированием действительно имеется.

Date: 2012-08-03 04:48 pm (UTC)
From: [identity profile] alexott.livejournal.com
только в этом случае, использование list оставит элементы как есть, в виде отдельных векторов, в то время как при использовании map/concat они будут "раскрыты"

Date: 2012-08-03 11:17 am (UTC)
From: [identity profile] palm-mute.livejournal.com
транспонированием

Date: 2012-08-03 11:19 am (UTC)
From: [identity profile] blackyblack.livejournal.com
Лоханулся я :)

Date: 2012-08-03 11:32 am (UTC)
From: [identity profile] freiksenet.livejournal.com
Если это надо объяснять то заинтересованные сотрудники не особо умны.

Date: 2012-08-03 11:36 am (UTC)
From: [identity profile] blackyblack.livejournal.com
Объяснять нужно. Ни из комментария, ни из определения функции не ясно, что будут первые элементы туплов с первыми объединены, а вторые со вторыми.

Date: 2012-08-03 11:39 am (UTC)
From: [identity profile] freiksenet.livejournal.com
То есть код читать нас не учили?

Date: 2012-08-03 11:43 am (UTC)
From: [identity profile] blackyblack.livejournal.com
Ну я прочитал. И гугл прочитал. Без примера и репла результат вообще не ясен.

Date: 2012-08-03 11:46 am (UTC)
From: [identity profile] freiksenet.livejournal.com
Это просто настолько стандартный пример с абсолютно стандартными функциями. Я помню даже на курсе по кложури в универе у нас такая задача была и я её именно так и решил.

Date: 2012-08-03 11:48 am (UTC)
From: [identity profile] blackyblack.livejournal.com
Дак написать это одно, а прочитать совсем другое. Я тоже на кложури когда писал - ставил кучу скобочек и всё понятно. А когда читать стал, понял, что чё-то непонятно где что.

Date: 2012-08-03 04:48 pm (UTC)
From: [identity profile] alexott.livejournal.com
а в каком это университете кложуре учат?

Date: 2012-08-03 05:26 pm (UTC)
From: [identity profile] freiksenet.livejournal.com
Университет Хельсники. Наша студенческая организация Lambda делала в тот раз (https://wiki.helsinki.fi/display/lambda/Clojure-kurssi), потом еще раз делали в Metropolia University of Applied Science.

Весной еще Хаскель и проект по нему были, тоже от лябмды.

Date: 2012-08-03 05:31 pm (UTC)
From: [identity profile] alexott.livejournal.com
классно вам...

Date: 2012-08-03 11:36 am (UTC)
From: [identity profile] metaclass.livejournal.com
Ну вот я говорю, что это очевидно - а на меня орут всей работой, что я совсем охренел в своих штудиях и поехал крышей.

Date: 2012-08-03 01:07 pm (UTC)
From: [identity profile] freiksenet.livejournal.com
Надо идти в контору которая не нанимает ебанашек. Идите к айседу.

Date: 2012-08-03 12:20 pm (UTC)
From: [identity profile] justy-tylor.livejournal.com
Ребе, в функциональщине со статической типизацией map работает с одной секвенцией, в языках с динамической типизацией зипует секвенции в параметры, и эксклюзивно в лиспах типа кложури внезапно начинает транспонировать. Это нельзя понять, это можно только запомнить.

Date: 2012-08-03 12:27 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Почему нельзя понять, все понятно же.
Транспонирование здесь совершенно логичное следствие зипования.

Date: 2012-08-03 12:58 pm (UTC)
From: [identity profile] justy-tylor.livejournal.com
Вообще да, но это такой хак, который сегодня работает, а завтра все 100500 параметров вместо кучи оказываются на стеке и получается пиздец. Лучше не рисковать.

Date: 2012-08-03 01:06 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Не, не, без нормально работающего apply у меня опердень вообще не запустится.
По-моему, это не хак, а идиоматически правильный способ.

Date: 2012-08-03 01:09 pm (UTC)
From: [identity profile] freiksenet.livejournal.com
В лиспах всегда так.

Date: 2012-08-03 04:45 pm (UTC)
From: [identity profile] alexott.livejournal.com
а сотрудникам выдай Орейлевскую книжку про кложуру - там доходчиво написано...

Date: 2012-08-03 04:50 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Уже выдал. И орейли, и Joy of Clojure.
Осталось заставить прочесть :)

Date: 2012-08-03 04:51 pm (UTC)
From: [identity profile] alexott.livejournal.com
а, ну это самое тяжелое :-)

Date: 2012-08-04 07:00 am (UTC)
From: [identity profile] nivanych.livejournal.com
Наручниками к батарее пристёгивать пробовали?

Date: 2012-08-04 07:22 am (UTC)
From: [identity profile] nivanych.livejournal.com
И не помогает?

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 27th, 2025 10:26 am
Powered by Dreamwidth Studios