clojure-russia

Работа и релокейт: #jobs-rus | #clojure-russia-offtop Телеграм-чат https://t.me/clojure_ru
anjensan 2017-09-18T10:08:34.000156Z

(defrecord T [key value subs]) - по сути мапа с 3мя ключами, только чуть побыстрее

anjensan 2017-09-18T10:14:18.000123Z

можешь и абстрактный интерфейс сделать - заведи свой (defprotocol, в нем пропиши нужные тебе операции

anjensan 2017-09-18T10:15:09.000114Z

а потом (deftype T [k a ss] ... clojure.lang.IPersistentCollection << реализации стандартных conj и т.п. >> YouProtocolName <<реализации твоих кастомных операций>>)

anjensan 2017-09-18T10:15:33.000107Z

только, имхо, это не сильно полезно

2017-09-18T11:15:06.000077Z

Спасибо, сейчас сделал через наивную мапу с 3 ключами, пытаюсь реализовать нужные алгоритмы

anjensan 2017-09-18T11:17:47.000052Z

ну так в том то и суть, что (defrecord T [k a s]) сгенерирует классик, с которым можно работать как с мэпой

anjensan 2017-09-18T11:18:22.000194Z

просто если в него ложить только для этих ключей (:k, :a, :s в данном случае) оно не будет реально запихивать все в хеш мепу, а положит как поле класса (что быстрее)

anjensan 2017-09-18T11:19:42.000342Z

так что замена тривиально - делаешь (defrecord T ...), а потом вместо {:k "key" :val 123} пишешь (->T "key" "123") или (map->T {:k "key" :val 123})

2017-09-18T11:20:42.000025Z

Хорошо, сейчас уже весь код написан с использованием абстракции 3-ключевой мапы, отлажу алгоритм на ней а потом поменяю на рекорды для скорости

2017-09-18T11:21:56.000132Z

Т.е. по-Хаскельному говоря, это трехэлементный кортеж, или изоморфный ему тип с 3 полями. Да, Кложа поначалу очень неудобный Хаскель... 🙂

anjensan 2017-09-18T11:25:54.000281Z

ну вообще да, это трехелементный кортеж

anjensan 2017-09-18T11:26:21.000090Z

поэтому... строго говоря можно хоть вектора из 3х элементов использовать

misha 2017-09-18T17:39:16.000092Z

@ivana а зачем такая структура данных нужна обычно?

2017-09-18T17:41:05.000479Z

чтобы иметь иерархическую структуру (дерево) с данными в каждом узле, с любым числом дочерних узлов каждой ветки и с идентификатором узлов/листьев

misha 2017-09-18T17:41:50.000167Z

а зачем?

2017-09-18T17:42:35.000415Z

конкретно мне требовалась для реализации свертки плоского результата SQLзапроса в иерархическую структуру для ответа GrqphQL

misha 2017-09-18T17:42:46.000641Z

когда это удобнее, чем глубокая мапа с ключами из всего подряд?

2017-09-18T17:43:27.000301Z

мне нужна не мапа, а розе-три с тегами

2017-09-18T17:43:58.000137Z

хотя можно сделать на любой структуре, имеющей данные абстракции, согласен

misha 2017-09-18T17:46:22.000508Z

мне, наверное, интересно, зачем свою такую писать, если может быть глубокая мапа по перфомансу и апи может быть не будет отличаться

misha 2017-09-18T17:47:31.000466Z

вики только на хаскель ссылается, что, мне кажется, выглядит как "детали имплементации", а не как "супер специальная крутая структура данных"

2017-09-18T17:47:45.000412Z

1. Затем что я спрашивал и выбирал, мне подсказали так. 2. В мапе как ты сделаешь список любой длины (дочерние ноды)? Списком? - это оно самое. Мапой - а нафига, еще ключи выдумывать

2017-09-18T17:48:21.000118Z

Так и мои мозги тоже пока на только Хаскель ссылаются, не окложурел еще 🙂

misha 2017-09-18T17:48:55.000245Z

ну вектора - тоже асоциативные, может там проще и нагляднее будет?

misha 2017-09-18T17:49:07.000617Z

и ключи выдумывать не надо

misha 2017-09-18T17:49:33.000268Z

[key value nodes]

2017-09-18T17:50:05.000512Z

Я вообще пока в Кложных датаструкчах путаюсь. Вектора тоже можно, да. В данном случае то же самое что списки будет

misha 2017-09-18T17:50:41.000486Z

правда, чтобы внутрь адрес написать, нужно будет (interleave path (repeate 2))

2017-09-18T17:51:59.000013Z

Просто мне бул нуже хэд/тэйл, и добавка в голову - а это список. В Хаскеле даже думать не надо 🙂 Да и хвост аргументов функции в Кложе про умолчанию трактуется как список. Хотя это обобщенные типы типа Лезисеков и прочего я действительно не раскурил еще.

misha 2017-09-18T17:52:46.000175Z

а, ок, развлекайся тогда :opieop:

2017-09-18T17:53:26.000169Z

А, да, и мап по структуре. По мапу в Кложе можно мап запускать? Вот и я не хотел запасаться граблями, а взял то что надежнее 🙂

2017-09-18T17:54:17.000133Z

Говоря по-Хаскельному, является ли ПерсистентМап экземпляром класса Функтор? 🙂

misha 2017-09-18T17:54:27.000133Z

(map identity {:foo :f :bar :b})
=&gt; ([:foo :f] [:bar :b])

misha 2017-09-18T17:55:08.000263Z

(map {:foo :f :bar :b} [:foo :bar :baz])
=&gt; (:f :b nil)

2017-09-18T17:55:25.000397Z

Не, такой хоккей нам не нужен - это не то поведение. А мапить дочерние узны одним мапом как функтор очень часто надо

2017-09-18T17:56:12.000408Z

поэтому их лучше секами

2017-09-18T17:56:37.000646Z

хотя вектор не сек, а тоже маппится... в общем, надо окложуреть еще получше 🙂

misha 2017-09-18T17:56:51.000099Z

я про вектор сказал, потому что на нем работает get-in

2017-09-18T17:57:21.000637Z

доступ по индексу что-ли? я выше перечислял, мне он не нужен.

misha 2017-09-18T17:58:56.000520Z

(let [L (list :a :b (list :c :d))
      V [:a :b [:c :d]]
      M {0 :a 1 :b 2 {0 :c 1 :d}}]
  [(get-in L [2 0])
   (get-in V [2 0])
   (get-in M [2 0])])
=&gt; [nil :c :c]

misha 2017-09-18T17:59:04.000076Z

ок

2017-09-18T18:01:16.000084Z

Просто в Хаскеле вектор не так просто юзать, синтаксис неудобный, и не фьюзится и еще 100 причин где можно применять списки - вот и мышление еще на АТД и списках 🙂 Хотя пару дней плотно пописал на Кложе - как же неудобно, что нет проверок типов и вообще типов 🙂

misha 2017-09-18T18:03:43.000129Z

кложа бета 1, everyone! https://groups.google.com/forum/#!msg/clojure/UEtE1K9C7XE/5p5BJe2tAQAJ

👍 4
andmed 2017-09-18T18:37:11.000275Z

всем привет. сорри за маленький оффтоп. кто в Украине, есть какая инфа по devfest в Львове в этом октябре. как сейчас с проездом из России, без проблем? (что-то боязно) что еще интересного из конференций будет этой осенью, посоветуйте, fp и не только. мертвый сезон вроде как а вот движухи захотелось

mike_ananev 2017-09-18T18:46:09.000015Z

Clojure 1.9.0-beta1 is now available

👋 1