Системи типу запобігають помилкам
Системи типу усувають незаконні програми. Розглянемо наступний код 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
Отже, довгий і короткий, це те, що системи типу виключають певні програми. Багато програм якимось чином ламаються, тому, використовуючи типові системи, ми уникаємо цих порушених програм.