(defrecord T [key value subs]) - по сути мапа с 3мя ключами, только чуть побыстрее
можешь и абстрактный интерфейс сделать - заведи свой (defprotocol, в нем пропиши нужные тебе операции
а потом (deftype T [k a ss] ... clojure.lang.IPersistentCollection << реализации стандартных conj и т.п. >> YouProtocolName <<реализации твоих кастомных операций>>)
только, имхо, это не сильно полезно
Спасибо, сейчас сделал через наивную мапу с 3 ключами, пытаюсь реализовать нужные алгоритмы
ну так в том то и суть, что (defrecord T [k a s]) сгенерирует классик, с которым можно работать как с мэпой
просто если в него ложить только для этих ключей (:k, :a, :s в данном случае) оно не будет реально запихивать все в хеш мепу, а положит как поле класса (что быстрее)
так что замена тривиально - делаешь (defrecord T ...), а потом вместо {:k "key" :val 123} пишешь (->T "key" "123") или (map->T {:k "key" :val 123})
Хорошо, сейчас уже весь код написан с использованием абстракции 3-ключевой мапы, отлажу алгоритм на ней а потом поменяю на рекорды для скорости
Т.е. по-Хаскельному говоря, это трехэлементный кортеж, или изоморфный ему тип с 3 полями. Да, Кложа поначалу очень неудобный Хаскель... 🙂
ну вообще да, это трехелементный кортеж
поэтому... строго говоря можно хоть вектора из 3х элементов использовать
@ivana а зачем такая структура данных нужна обычно?
чтобы иметь иерархическую структуру (дерево) с данными в каждом узле, с любым числом дочерних узлов каждой ветки и с идентификатором узлов/листьев
а зачем?
конкретно мне требовалась для реализации свертки плоского результата SQLзапроса в иерархическую структуру для ответа GrqphQL
когда это удобнее, чем глубокая мапа с ключами из всего подряд?
мне нужна не мапа, а розе-три с тегами
хотя можно сделать на любой структуре, имеющей данные абстракции, согласен
мне, наверное, интересно, зачем свою такую писать, если может быть глубокая мапа по перфомансу и апи может быть не будет отличаться
вики только на хаскель ссылается, что, мне кажется, выглядит как "детали имплементации", а не как "супер специальная крутая структура данных"
1. Затем что я спрашивал и выбирал, мне подсказали так. 2. В мапе как ты сделаешь список любой длины (дочерние ноды)? Списком? - это оно самое. Мапой - а нафига, еще ключи выдумывать
Так и мои мозги тоже пока на только Хаскель ссылаются, не окложурел еще 🙂
ну вектора - тоже асоциативные, может там проще и нагляднее будет?
и ключи выдумывать не надо
[key value nodes]
Я вообще пока в Кложных датаструкчах путаюсь. Вектора тоже можно, да. В данном случае то же самое что списки будет
правда, чтобы внутрь адрес написать, нужно будет (interleave path (repeate 2))
Просто мне бул нуже хэд/тэйл, и добавка в голову - а это список. В Хаскеле даже думать не надо 🙂 Да и хвост аргументов функции в Кложе про умолчанию трактуется как список. Хотя это обобщенные типы типа Лезисеков и прочего я действительно не раскурил еще.
а, ок, развлекайся тогда :opieop:
А, да, и мап по структуре. По мапу в Кложе можно мап запускать? Вот и я не хотел запасаться граблями, а взял то что надежнее 🙂
Говоря по-Хаскельному, является ли ПерсистентМап экземпляром класса Функтор? 🙂
(map identity {:foo :f :bar :b})
=> ([:foo :f] [:bar :b])
(map {:foo :f :bar :b} [:foo :bar :baz])
=> (:f :b nil)
Не, такой хоккей нам не нужен - это не то поведение. А мапить дочерние узны одним мапом как функтор очень часто надо
поэтому их лучше секами
хотя вектор не сек, а тоже маппится... в общем, надо окложуреть еще получше 🙂
я про вектор сказал, потому что на нем работает get-in
доступ по индексу что-ли? я выше перечислял, мне он не нужен.
(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]
ок
Просто в Хаскеле вектор не так просто юзать, синтаксис неудобный, и не фьюзится и еще 100 причин где можно применять списки - вот и мышление еще на АТД и списках 🙂 Хотя пару дней плотно пописал на Кложе - как же неудобно, что нет проверок типов и вообще типов 🙂
кложа бета 1, everyone! https://groups.google.com/forum/#!msg/clojure/UEtE1K9C7XE/5p5BJe2tAQAJ
всем привет. сорри за маленький оффтоп. кто в Украине, есть какая инфа по devfest в Львове в этом октябре. как сейчас с проездом из России, без проблем? (что-то боязно) что еще интересного из конференций будет этой осенью, посоветуйте, fp и не только. мертвый сезон вроде как а вот движухи захотелось
Clojure 1.9.0-beta1 is now available