Системы типов предотвращают ошибки
Тип системы устраняет нелегальные программы. Рассмотрим следующий код Python.
a = 'foo'
b = True
c = a / b
В Python эта программа не работает; это исключение. На таких языках, как Java, C #, Haskell , что угодно, это даже не легальная программа. Вы полностью избегаете этих ошибок, потому что они просто невозможны в наборе программ ввода.
Аналогично, лучшая система типов исключает больше ошибок. Если мы перейдем к суперсовременным системам типов, мы можем сказать что-то вроде этого:
Definition divide x (y : {x : integer | x /= 0}) = x / y
Теперь система типов гарантирует отсутствие ошибок деления на 0.
Какие ошибки
Вот краткий список того, что системы типов ошибок могут предотвратить
- Ошибки вне диапазона
- SQL-инъекция
- Обобщая 2, много вопросов безопасности (для чего проверка на зараженность в Perl )
- Внеочередные ошибки (забыл вызвать init)
- Принудительное использование подмножества значений (например, только целые числа больше 0)
Гнусные котята (Да, это была шутка)
- Ошибки с потерей точности
- Ошибки программной транзакционной памяти (STM) (это требует чистоты, которая также требует типов)
- Обобщая 8, контролируя побочные эффекты
- Инварианты над структурами данных (сбалансировано ли двоичное дерево?)
- Забыть исключение или выбросить неправильное
И помните, это также во время компиляции . Не нужно писать тесты со 100% покрытием кода, чтобы просто проверять ошибки типов, компилятор сделает это за вас :)
Пример: типизированное лямбда-исчисление
Хорошо, давайте рассмотрим простейшую из всех систем типов, просто типизированное лямбда-исчисление .
В основном есть два типа,
Type = Unit | Type -> Type
И все термины являются либо переменными, лямбда-выражениями, либо приложением. Основываясь на этом, мы можем доказать, что любая хорошо типизированная программа завершается. Никогда не бывает ситуации, когда программа застрянет или зациклится навсегда. Это не доказуемо в нормальном лямбда-исчислении, потому что это не так.
Подумайте об этом, мы можем использовать системы типов, чтобы гарантировать, что наша программа не зацикливается вечно, а круто, верно?
Обход в динамические типы
Системы динамического типа могут предлагать такие же гарантии, что и системы статического типа, но во время выполнения, а не во время компиляции. На самом деле, так как это время выполнения, вы можете предложить больше информации. Однако вы теряете некоторые гарантии, особенно в отношении статических свойств, таких как завершение.
Таким образом, динамические типы не исключают определенные программы, а скорее направляют искаженные программы к четко определенным действиям, таким как создание исключений.
TLDR
Итак, в общем и целом, системы типов исключают определенные программы. Многие из программ каким-то образом не работают, поэтому в системах типов мы избегаем этих неработающих программ.