Анна
а блин, я же автоматические тесты хотела добавить
Анна
gsomix
Анна
А какие проблемы?
я просто говоря без понятия, как там в платформу интегрировать тесты на странных языках. Не факт, что за лето разберусь
gsomix
Понял.
Анна
всякие джавы-сиплюсплюсы изкаропки там
Vladislav
Понял.
А ты из универа свалил? Вроде писал нечто подобное
Анна
моя мечта - заставить студентов самих друг у друга лабы проверять, но это ещё сложнее автоматически сделать :) Надо как peer review в курсере
gsomix
Vladislav
Понятно
Nikolay
Nikolay
gsomix
Можно экстрактить код в OCaml или C.
Romɑn
Vasily
F* пока выглядит для меня как матан высшего порядка :(
Vasily
Хотя для общего образования полезно, наверное
gsomix
о, а как?
Я не знаю, посмотри флаги компилятора. :)
Vasily
Я так понимаю, он руки отрезает значительно жёстче, чем f#
Ayrat
Намертво, не пришить.
Ayrat
Но в нём конечно тайп инфиренс ядерный
из этого кода
let rec factorial n =
if n = 0 then 1 else n * (factorial (n - 1))
оно выводит такой тип:
val factorial: x:int{x>=0} -> Tot int
т.е. поняло что >=0 и что на выходе Tot int, тотальная функция
Vasily
Кстати, неясно,как вывели
Vasily
Что >=0
Vasily
Неясно
Vasily
Romɑn
при нуле - ноль, меньше нуля - уход в бесконеность - больше все сходится к инту
Ayrat
стоп, я прогнал
Romɑn
Ayrat
именно
Vasily
Ну дык -2 можно подсунуть
Vasily
Там ещё is_positive
Vasily
В теории 😉
Ayrat
оно не так работает
For a recursive function, without further annotation, F* attempts to automatically prove that the recursion always terminates. In the case of factorial above, F* attempts to prove that it has type int -> Tot int, and fails to do so because, factorial is actually not a total function on arbitrary integers! Think about factorial -1.
Анна
x>=0 это может оно и есть? Условия, при которых работает и тотальное?
Ayrat
The factorial function is, however, a total function on non-negative integers. We can ask F* to check that this is indeed the case by writing:
val factorial: x:int{x>=0} -> Tot int
Ayrat
Once we write this down, F* automatically proves that factorial satisfies all these properties.
Анна
Ayrat
да. Но т.к. есть тайп инфиринс, то функция примет такой тип
Vasily
Там вначале пишется сигнатура с условиями
Ayrat
т.е. ты аннотируешь условие и это условие идёт в тип функции
Анна
Ну ладно, кажется я немного поумнела
Vasily
Вот прямо в спеке ихней
Vasily
В общем, такой способ метаданные вкрутить
Vasily
Как я понимаю
Ayrat
ну. Почти) Там в типе может быть отображено что функция расходится например или аллоцирует!
Vasily
Ну метаданные же
Ayrat
Ну если ты типы называешь метаданными, то пусть будут метаданными)))
Vasily
Так.Стоп
Vasily
Мы сначала описываем тип функции, потом его имплементируем?
Ayrat
это называется refinment type типа
Ayrat
ype f:filename{canRead f} is a refinement of the type filename
Ayrat
т.е. можно быстро создавать подмножества типов, которые тоже типы очевидно (потому что тоже множества)
Vasily
Штука интересная, но чтобы применить в продакшне, надо быть очень умным
Vasily
Кмк
Ayrat
Так точно, оно неприменимо для 99.99999% задач
Ayrat
но вообще верифицирующие языки применяются. Их не один
Vasily
Ну из очевидных применений ,очевидно ,криптография
Vasily
Там как раз верификация алгоритма важна
Nikolay
Nikolay
Хозяйственный мужчина никому не нужен?
gsomix
Именно в индустрии, а не академии. :)
Igor
Igor
Vasily
В индустрии подобного рода задачи даже не совсем понятно где
Vasily
Для финтеха выглядит интересно
Vasily
Какой-нибудь процессинг платежей со строгой верификацией,но тоже сомнительно
Vasily
Получается довольно низкоуровневая вещь
Vladislav
gsomix
Vasily
Vasily
Файловые системы, кстати
Vasily
Ещё, возможно, протоколы обмена данными
Vasily
Но тут очень спорный момент
Vasily
В общем всё, где есть пользовательские данные, идёт мимо