Oleg
ну это такой метаязык
Sherzod
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
Oleg
polymorphism
Oleg
ну для HKP, нужно, чтобы в качестве параметра генерика можно было передать тип хотя бы * -> * , т.е. тип с дыркой
Dmitry
Прижилась дырка
Oleg
т.е. чтобы твой генерик мог потенциально генерировать все разновидности, которые можно получить подставляя в свой параметр другие типы
Oleg
без стирания типов это, насколько мне известно, не реализуется
Danila Matveev
плюс момент что раст делает имплементации параметрических типов специализированными
Anonymous
Danila Matveev
в книге упоминалось существование редких ситуаций с динамической диспатчеризацией, но я в детали не вникал еще
сделано только по причине того, что иногда динамическая более производительна чем статическая
доня.
не совсем так
гугли про trait object, в общем, динамический диспатч есть, только тогда это уже не дженерик и не записывается как дженерик
Oleg
ну представь у тебя
trait Functor <F<_>>{
fn map<A, B>(fa: F<A>, f : A -> B) -> F<B>
}
такая имплементация должен уметь производить любой F<B>, имя потенциально лишь B.
Если B в рантайме превращён а адрес, ссылку на произвольный тип без лайфтайма и всего такого - это реализуемо.
Если B может иметь варьируемый размер и содержать субструктурную информацию в типе - это уже крайне затружнительно
Мерль
Знаете, чего мне не хватает?
Мерль
Детектора дедлоков
Мерль
Чтобы он паниковал, если все потоки залочились на мьютексах
Oleg
Детектора дедлоков
а ведь эта задача очень даже реализуема, если расширить систему типов в Rust
Filipp
да вроде и без типов легко реализовать - каждый поток когда ждет мьютекса ставит свой бит ожидания в "1", если биты всех потоков стоят в 1 - дедлок
Oleg
Мерль
Мерль
Мерль
Но это прямо ваще сложное колдунство
На две диссертации
Oleg
тут вот есть @clayrat, он представляет лучший чат в телеграмме, и он знает что с этим делать
Мерль
Я знаю, что более менее теория для таких верификаций сделана для csp
Oleg
там регулярно проскакивают фразу вроде "сессионные типы - это почти линейные типы"
Loyd
arrow function не вызвать из себя
Loyd
Если, конечно, не унести в замыкание переменную, где она лежит
Loyd
Loyd
Это параллельные вещи вообще
Oleg
Oleg
это параллельные вещи с очень схожей типотеорной семантикой
Oleg
грубо говоря, компилятор, который может делать одно, можно дописать, чтобы он мог делать оба
Oleg
а ведь растопилятор может одно
Loyd
Сессионные без линейных (точнее афинных) не сделать, это да, но сессионные это не отдельная система, лол
Oleg
Loyd
В том смысле, что не связанны
Loyd
Сессионные это не система типов
Loyd
Как линейные и прочие
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
хаскель очень умный, во многих случаях он умеет мономорфизировать как rust, но есть случаи, где мономорфизация принципиально невозможна
доня.
так, стоп
типы в том же х-ле ведь выводятся все равно, иначе бы не чекались, зачем их стирать тогда
Oleg
яркий пример - полиморфная рекурсия
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
как будто в расте у тебя в бинарнике осталось что-то кроме примитивов
доня.
плохо прочитал
доня.
стирать не в том смысле
доня.
стирать как в джаве