Vladimir
Это ж нехера не красиво буит
Денис
ну имплементация будет некрасивой, а интерфейс — самый обычный
Vladimir
Тогда что красивого?
Денис
то, что компилятор гарантирует, что список непустой =)))
Anonymous
Это ж нехера не красиво буит
по-моему всё же красивее решения на ассертах которое доверяет разработчику
Vladimir
по-моему всё же красивее решения на ассертах которое доверяет разработчику
Ну вместо ассертов конечно можно просто чек въебать и возвращать вместо Option<V> в remove Result<V>
Anonymous
ну проблема та же остается
Денис
я честно говоря чё-то не могу такого нагуглить даже без "rust"
Vladimir
Опять таки, возвращаюсь к исходному вопросу: есть хешмапа на типах?
Vladimir
Возможно не все задачи можно элегантно решать на типах?
Денис
ну вот конкретно мою — можно
Денис
тривиальное решение существует =)
Anonymous
на хаскеле такое же решение
Денис
хохо, неплохо
Anonymous
что в нем неэлегантного? @c_vld
Денис
много бойлерплейта на самом деле, всегда приходится отдельно обрабатывать первый элемент
Berkus
так это не на типах
именно что не на типах )
Anonymous
именно что не на типах )
просили на типах
պլհկ
Do you even SESSION TYPES bro
Vladimir
что в нем неэлегантного? @c_vld
Я не понимаю эльфийский, соре
Anonymous
Я не понимаю эльфийский, соре
ну это то же самое что я отправил на расте
Anonymous
тот стракт и отдельный хендлинг первого элемента
Vladimir
Ну тебе ответил Денис, слишком много ебли с отдельным полем и всё те же чеки что и без этой ебли в рантайме.
Денис
ну слушай, чеки всё-таки далеко не те же
Денис
скажем, мне компилятор физически не даст возможности сделать пустую мапу, если объявить её таким образом
Vladimir
Remove first => assert hm.len() >0
Vladimir
скажем, мне компилятор физически не даст возможности сделать пустую мапу, если объявить её таким образом
Да, просто говорю же, что те же чеки что и так в рантайме дублируются, потому что хешмапа не на типах
Денис
я в общем-то не спорю, что у такого решения выгода (на мой взгляд) сугубо теоретическая, что, мол, компилятор гарантирует, что мапа непустая
Денис
так-то гораздо проще рантайм-проверки вставить
Vladimir
Т.е. при удалении первого значения, нужно делать те же чеки что в рантаймовском варианте всегда.
Денис
но я хочу непустую мапу, которая гарантируется компилятором =)
Денис
Т.е. при удалении первого значения, нужно делать те же чеки что в рантаймовском варианте всегда.
да, но разница в том, что физически невозможно замутить состояние, когда мапа становится пустой
Денис
рантайм-оверхед не снижается, это понятно
Денис
он наоборот кмк возрастёт =)
Vladimir
Добавь тест и делай в рантайме
Vladimir
Так все питонисты делают
Денис
xD
Vladimir
Играетесь тут со своими типами в игрушечном языке
Денис
Играетесь тут со своими типами в игрушечном языке
следующий шаг — https://t.me/rustlang_ru/145353
Anonymous
ага, согласен что с этим решением есть проблемы, но всё же не отнимает от факта того, что это наиболее эффективное решение с возможностями системы типов
Anonymous
надо просто вынести в модуль как в хаскеле со всей реимплементацией и забыть
Anonymous
в итоге получится в несколько степеней лучше чем если делать с ассертами
Berkus
рантайм-оверхед не снижается, это понятно
ну ведь это легко сделать в расте на типах, через newtype
(((Sergey(not seresha))
Раст - заебись
Денис
ну ведь это легко сделать в расте на типах, через newtype
что именно легко сделать? убрать рантайм-оверхед?..
(((Sergey(not seresha))
Zero coast
(((Sergey(not seresha))
No
Anonymous
FEARLESS CONCURRENCY
(((Sergey(not seresha))
But time
Berkus
что именно легко сделать? убрать рантайм-оверхед?..
наоборот, заставить гарантировать невозможность удалить последний элемент
Berkus
Zero coast
можно пожалуйста без многострочной наркомании?
Денис
наоборот, заставить гарантировать невозможность удалить последний элемент
да, но если наш тип — это T = (key, HashSet<key>), то при удалении элемента T.0, нам нужно проверить, что T.1 — не пустой
Berkus
ты же изначально хотел непустой сет, правильно?
Anonymous
дак наш тип должен быть T = (key, NonemptySet<key>) конечно же
это бесконечно рекурсирующий тип получается
Денис
NonEmptySet = (key, NonEmptySet) ?)
Денис
ненене дэвид блейн
Berkus
NonEmptySet = (key, NonEmptySet) ?)
ты знаешь что такое Set? откуда там value вдруг
Денис
да хоть сет хоть мапа, разницы принципиальной тут нет
Berkus
разница в том вокруг чего у тебя обертка newtype
Berkus
NonemptyMap<key, NonemptySet<T>> это всегда непустая мапа со всегда непустыми значениями
Денис
да, и именно её мне и нужно реализовать
Денис
потому что добрых людей, уже сделавших это, по всей видимости, не нашлось
Денис
блин
Денис
в глаза ебусь, сорян
Berkus
ну так это, pub struct NonemptyMap<K,V>(Map<K,V>) и вперед
Денис
ну так это, pub struct NonemptyMap<K,V>(Map<K,V>) и вперед
ты точно прочитал нашу переписку?
Anonymous
🤔
Vladimir
🤔
Оно приватное
Денис
в общем мы на самом деле вроде со всем разобрались
Anonymous
а лол
Денис
всем спасибо за участие в беседе)
Berkus
NonemptyMap(Map::new())
чуваки, по-моему вы тупите
Vladimir
на типах можно (упрощенно) struct NonEmptyKV<K, V> { first: (K, V), other: Vec<(K, V)> }
let x:NonEmptyKV<K,V>= unsafe{ mem::unitialised()} Смари как могу, и типы нипочём
Anonymous
чуваки, по-моему вы тупите
ну я понял что ты хочешь предложить решение где такой тип проверяется в рантайме