Fork me on GitHub
#clojure-russia
<
2017-09-18
>
anjensan10:09:34

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

anjensan10:09:18

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

anjensan10:09:09

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

anjensan10:09:33

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

ivana11:09:06

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

anjensan11:09:47

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

anjensan11:09:22

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

anjensan11:09:42

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

ivana11:09:42

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

ivana11:09:56

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

anjensan11:09:54

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

anjensan11:09:21

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

misha17:09:16

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

ivana17:09:05

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

misha17:09:50

а зачем?

ivana17:09:35

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

misha17:09:46

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

ivana17:09:27

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

ivana17:09:58

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

misha17:09:22

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

misha17:09:31

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

ivana17:09:45

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

ivana17:09:21

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

misha17:09:55

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

misha17:09:07

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

misha17:09:33

[key value nodes]

ivana17:09:05

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

misha17:09:41

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

ivana17:09:59

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

misha17:09:46

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

ivana17:09:26

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

ivana17:09:17

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

misha17:09:27

(map identity {:foo :f :bar :b})
=> ([:foo :f] [:bar :b])

misha17:09:08

(map {:foo :f :bar :b} [:foo :bar :baz])
=> (:f :b nil)

ivana17:09:25

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

ivana17:09:12

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

ivana17:09:37

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

misha17:09:51

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

ivana17:09:21

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

misha17:09:56

(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])])
=> [nil :c :c]

ivana18:09:16

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

andmed18:09:11

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

mike_ananev18:09:09

Clojure 1.9.0-beta1 is now available