кана
а фиг его знает, я сейчас пробую написать тайпчекер лямбда исчисления с зав типами, чтобы понять
Vladimir
просто мне кажется, что по факту это ничем не отличается от енамов
кана
но он там как-то отношения между термами проверяет, а не реальные значения, как я понял
кана
так нет, енам это тупо ADT, сумма-тип и произведение-тип, это притивные вещи. DT это еще пи-тип и сигма-типы
Vladimir
мне интересно именно на каком этапе это должно упасть. если например описал ты протокол в котором в зависимости от первого байта, возвращает значение с определенным типом. А пользователь при этом пропихнул тебе какую-то ггадость
кана
https://t.me/kanaflow/3 - вот тут серия моих постов, где я пытался описать и ADT, и завтипы (реклама так реклама)
Alex
если забыл проверку на гадость то на этапе компиляции
Alex
если не забыл, то нигде :)
Vladimir
если забыл проверку на гадость то на этапе компиляции
короче оно будет работать аналогично энамам, только всё диспетчеризацию возьмет на себя компилятор
Vladimir
правильно я понимаю?
Alex
ну так можно и к ассемблерным джампам свести
doc
а нужно ли так сложно?)
Alex
компилятор берет на себя вычисления в компайлтайме
Vladimir
ну я кажись понял
Vladimir
это короче приблуда, чтобы матчи не писать
Vladimir
вот
Alex
матчи там надо писать все равно
Loo
Вечер зависимых типов в группе раста
Vladimir
Loo
Щас кана сама пояснит вам за жизнь
кана
да я скинул посты, где я пояснял, че мне еще писать
Vladimir
кто такой кана
кана
я
Vladimir
известный хаскелист?
кана
не, начинающий ток
Anonymous
а оно нужно?
гофер: а генерики нужны?
Vladimir
Можно ж копипастить, зачем генерики?
Vladimir
А про зав типы я не понял плюсов кроме формальной верификации
Anonymous
Можно ж копипастить, зачем генерики?
а можно юзать Any и падать в рантайме
Anonymous
здесь также
кана
ну лучше типизация же, еще строже, больше ошибок покрывает. Чисто теоретически завтипы полностью могут заменить тесты, но не думаю, что так кто-то пишет
Евгений
кроме монад
rust-mdo же есть
Vladimir
Так сказали ж, что всеравно матчить надо
Vladimir
И падать всеравно в рантайме
Anonymous
что матчить
Vladimir
Значение
кана
компилятор будет ругать тебя, если ты не проверишь
Anonymous
М
Anonymous
энам из пятиста чисел тоже будешь делать?
Vladimir
энам из пятиста чисел тоже будешь делать?
Я ж так понял что количество ветвей не уменьшится с зав типами, не?
кана
суть в том, что имея тип (псевдоязык) (b : Bool, if b then String else Int) мы просто по факту не можем составить значение (True, 1), хоть в рантайме, хоть в комплайтайме. или имея функцию (a: Nat) -> (b: Nat) -> (a < b) -> Nat мы просто по факту не сможем передать в функцию такие числа, что b будет меньше a, хоть в рантайме, хоть в компайлатйме. (a < b) - это пруф, что a меньше b. Если его не передать явно, то и функцию вызывать нельзя. А передать его можно только если построив. А построив его можно только явно
Vladimir
Ну а если мы получили тип бул из ввода полтзователя
Vladimir
Как тут быть?
Anonymous
Ну а если мы получили тип бул из ввода полтзователя
если мы составляем значения типа то нам нужно будет доказательство что мы это корректно делаем
Anonymous
компилятор может инферить такие если сделать проверки
Anonymous
кстати как в идрисе сделать тип с предикатом? чет сложно по сравнению с ликвидхаскелем
кана
вот я как-то писал пример кода, который читает длину массива и работает с векторами введенной длины мы тут типизруем, что вектор с сумммой имеет именно n + m длину
Anonymous
ну допустим число на интервале [0, 1]
кана
как-то такой вопрос задвали в идрис конфе, ответ был - можно, но геморно. Fin можно использовать для 0..N
Anonymous
ого
Anonymous
думал такое там тривиально
кана
могу предположить, что просто смарт конструктор, который требует пруфы, что a <= x <= b, но я хз вообще, нужно там спрашивать
Anonymous
кк
Anton
МММ
Anton
29142 segmentation fault (core dumped)
Anton
Закрутилась карусель, потекло дерьмецо то
Евгений
Ну а если мы получили тип бул из ввода полтзователя
Никак, ты из ввода пользователя получаешь String, который превращаешь в Option<Bool> (или Result<Bool, String> например), а потом прокидываешь через Some корректное вычисление над Bool.
Vladimir
Что значит корректное вычисление?
Евгений
Смысл зависимых типов же не в том, чтобы данные корректно типизировать, это фигня несложно в любом языке делается, где данные от функций изолированы. Фишка зависимых типов в доказательстве тотальности, гарантии что твой сраный алгоритм не разойдётся и не уйдёт в бесконечность на определённом входе, а завершится. Мы просто внутрь нашего ЯП'а пихает очень мощную, но тьюринг-неполную машину
Vladimir
А почему важно что она не полная?
Евгений
Halting problem, не слышал?
Vladimir
Не
A64m
можно делать и без проверки завершимости, но тогда все доказательства надо будет выичслять в рантайме, что не весело, понятное дело
Евгений
Не
А про машину тьюринга?
A64m
пролог это поиск доказательства, а тут вычисление конструктивного доказательства
Vladimir
А про машину тьюринга?
Ну что-то мельком
Евгений
Ну что-то мельком
Типа смысл в том, что мы моделируем вычисление как некую машину с бесконечной лентой, одним "указателем" на ней и каким-то глобальным навсегда заданным множеством состояний. На ленте написаны нолики и единички, в каждый шаг машина может в зависимости от значения на ленте и состояния машина может поменять состояние ячейки, двинуть вправо/влево курсор и поменять состояние. Выделяют кроме того специальное состояние "а, нахуй", после которого машина перестаёт двигаться. Крутость этой штуки в том, что можно скостылить такую машину тьюринга, что мы можем на ленте "закодировать" любую другую машину тьюринга и её вход, так что если закодированная маштна тьюринга останавливается, то наша универсальная тоже, да они ещё и одинаковый результат имеют. А если закодированная не останавливается, то и универсальная будет работать бесконечно
Vladimir
Допустим
Vladimir
(я уже прочитал в Вики по тегам которые вы кинули) но интересно к чему приведет дальше
Евгений
Сразу встаёт вопрос -- а чо нельзя скостылить машину тьюринга, которая на входе берёт любую другую закодированную машину и её вход, останавливается и даёт ответ 0, если закодированнвя не останавливается и работает вечно, если закодированная останавливается. А нихуя, такой машины создать нельзя
Vladimir
Как жить то теперь
Евгений
Но! Мы можем написать такие алгоритмы, которые работают для некоторого подмножества, более узкого набора машин тьюринга. Более того, мы можем бесконечно приближаться к идеальному результату, создавать всё более и более широкие классы машин, для которых мы можем на компьютере проверять проверять завершаются ли они или нет
Loo