Oleg
ну это такой метаязык
Sherzod
Судя по репе, у него только шаблонизатор https://github.com/alexander-irbis/incrust
это часть. В гиттере он говорил, что пока не хочет публиковать свой код.
Oleg
можно сделать так ListF a x = Nul | Cons a x
Oleg
соотвественно, если определить data Fix f = Fix (f (Fix f))
Oleg
то List a ~ Fix (ListF a)
Oleg
но в расте же нет HKP, поэтому такой Fix я не запишу, насколько я понимаю
Safort
это часть. В гиттере он говорил, что пока не хочет публиковать свой код.
Ок. Давно там не был, там gamedev раздел особенно интересный)
Oleg
polymorphism
Oleg
ну для HKP, нужно, чтобы в качестве параметра генерика можно было передать тип хотя бы * -> * , т.е. тип с дыркой
Dmitry
Прижилась дырка
Oleg
т.е. чтобы твой генерик мог потенциально генерировать все разновидности, которые можно получить подставляя в свой параметр другие типы
Oleg
без стирания типов это, насколько мне известно, не реализуется
Danila Matveev
плюс момент что раст делает имплементации параметрических типов специализированными
Oleg
плюс момент что раст делает имплементации параметрических типов специализированными
да т.е. мономорфизация vs стирание, производительность vs высшие абстрации, CLR vs JVM
Danila Matveev
в книге упоминалось существование редких ситуаций с динамической диспатчеризацией, но я в детали не вникал еще сделано только по причине того, что иногда динамическая более производительна чем статическая
доня.
не совсем так гугли про trait object, в общем, динамический диспатч есть, только тогда это уже не дженерик и не записывается как дженерик
Sherzod
Ок. Давно там не был, там gamedev раздел особенно интересный)
Сейчас там Кварк немножко активный, начал пилить свой движок
Oleg
ну представь у тебя trait Functor <F<_>>{ fn map<A, B>(fa: F<A>, f : A -> B) -> F<B> } такая имплементация должен уметь производить любой F<B>, имя потенциально лишь B. Если B в рантайме превращён а адрес, ссылку на произвольный тип без лайфтайма и всего такого - это реализуемо. Если B может иметь варьируемый размер и содержать субструктурную информацию в типе - это уже крайне затружнительно
Safort
Сейчас там Кварк немножко активный, начал пилить свой движок
Так он же уже итак пилил GFX и Claymore. Или это что-то другое?
Мерль
Знаете, чего мне не хватает?
Мерль
Детектора дедлоков
Мерль
Чтобы он паниковал, если все потоки залочились на мьютексах
Oleg
Детектора дедлоков
а ведь эта задача очень даже реализуема, если расширить систему типов в Rust
Filipp
да вроде и без типов легко реализовать - каждый поток когда ждет мьютекса ставит свой бит ожидания в "1", если биты всех потоков стоят в 1 - дедлок
Мерль
Но это прямо ваще сложное колдунство На две диссертации
Oleg
тут вот есть @clayrat, он представляет лучший чат в телеграмме, и он знает что с этим делать
Мерль
Я знаю, что более менее теория для таких верификаций сделана для csp
Oleg
там регулярно проскакивают фразу вроде "сессионные типы - это почти линейные типы"
Loyd
arrow function не вызвать из себя
Loyd
Если, конечно, не унести в замыкание переменную, где она лежит
Мерль
Я знаю, что более менее теория для таких верификаций сделана для csp
Вплоть до того, что зная нагрузку можно точно посчитать размеры буферов для каналов
Loyd
Это параллельные вещи вообще
Oleg
Щито?!
что не так?
Oleg
это параллельные вещи с очень схожей типотеорной семантикой
Oleg
грубо говоря, компилятор, который может делать одно, можно дописать, чтобы он мог делать оба
Oleg
а ведь растопилятор может одно
Loyd
Сессионные без линейных (точнее афинных) не сделать, это да, но сессионные это не отдельная система, лол
Loyd
В том смысле, что не связанны
Loyd
Сессионные это не система типов
Loyd
Как линейные и прочие
Oleg
Сессионные это не система типов
объясните это заявление, пожалуйста
Sherzod
Так он же уже итак пилил GFX и Claymore. Или это что-то другое?
Он подключился к аметистам, при этом параллельно начал писать three-rs
Sherzod
https://github.com/kvark/three-rs
Safort
О, шикарно!
Oleg
Здесь вот http://users.eecs.northwestern.edu/~jesse/pubs/alms/tovpucella-alms.pdf говорится, что We argue that a general, practical type system based on Girard’s linear logic (1987) can naturally and directly express many of the special cases, such as region-based memory management, aliasing control, session types, and typestate.Таким образом система типов с линейной логикой может реализоваывать не только region-based memory management (rust), но и сессионные типы
Oleg
Именно на основании таких утверждений я и говорю, что используя то же ядро компилятора в rust можно запихнуть и concurrency control
Oleg
не валидный, о том и говорил
Oleg
да, мы пришли к общему знаменателю
Oleg
не предлагаю
Oleg
просто говорил о HKP в расте
Oleg
haskell, scala, purescript, coq, agda, idris ...
Oleg
все системы построены на стирании типов и runtime dispatch для реализаций trait
Oleg
В haskell\purescript type class ы В scala\idris implicit parameters
доня.
подожди, разве тот же функтор нельзя в компайл-тайме специализировать?
доня.
а, понятно то есть типа HKP со специализацией в компайл-тайме в расте всё-таки не ждать, как я понимаю(
Oleg
подожди, разве тот же функтор нельзя в компайл-тайме специализировать?
проблема не в вызове метода, а в написании уже полиморфных функций вида fn foo<F<_> : Functor>
Oleg
хаскель очень умный, во многих случаях он умеет мономорфизировать как rust, но есть случаи, где мономорфизация принципиально невозможна
доня.
так, стоп типы в том же х-ле ведь выводятся все равно, иначе бы не чекались, зачем их стирать тогда
Oleg
яркий пример - полиморфная рекурсия
Oleg
рассмотрим любимую в хаскеле пару структур данных для 2-3 дерева data Node a = Node2 a a | Node3 a a a data Tree a = Single a | Cons (Tree (Node a))
Oleg
на уровне типов гарантируется, что любая ветвь дерева имеет одинаковую глубину
Oleg
теперь представьте себе реализацию Foldable для такого типа
Oleg
Она должна уметь в рантайме сгенерировать функции, которые могут работать с Node ( Node ( Node ... )) непресказуемого порядка вложенности
доня.
понял, спасибо
Oleg
То же самое для HKP - попробуйте реализовать Free монаду
Oleg
Которая может иметь неопределённое количество обёрток функтора
Danila Matveev
так, стоп типы в том же х-ле ведь выводятся все равно, иначе бы не чекались, зачем их стирать тогда
типы нужны для доказательства корректности кода если код на этапе компиляции получился корректный, то после компиляции тебе типы уже не сдались (за исключением костылестроения на рантайм рефлексии)
Danila Matveev
я тред прочитал, комментарий был к "зачем их стирать"
Danila Matveev
как будто в расте у тебя в бинарнике осталось что-то кроме примитивов
доня.
плохо прочитал
доня.
стирать не в том смысле
доня.
стирать как в джаве