Для того, щоб зрозуміти це твердження, спершу треба зрозуміти, що нам купує система статичного типу. По суті, те, що дає нам система статичного типу, є гарантією: якщо програма перевіряє тип програми, певний клас поведінки виконання не може виникнути.
Це звучить зловісно. Ну, перевірка типу схожа на перевірку теореми. (Насправді, згідно із ізоморфізмом Керрі-Говарда - це одне й те саме.) Одне, що дуже властиво теоремам, - це те, що, коли ти доводиш теорему, ти доводиш саме те, що говорить теорема, не більше. (Ось, наприклад, чому, коли хтось каже "Я довів цю програму правильною", ви завжди повинні запитувати "будь ласка, визначте" правильну "".) Те саме стосується систем типів. Коли ми кажемо, що "програма є безпечною для типу", ми маємо на увазі не те, що можлива помилка не може виникнути. Можна сказати лише те, що помилки, які система типу обіцяє нам запобігти, не можуть виникнути.
Отже, програми можуть мати нескінченну кількість різних режимів виконання. З них нескінченно багато корисних, але також нескінченно багато з них є "неправильними" (для різних визначень "правильність"). Система статичного типу дозволяє нам довести, що певний обмежений, фіксований набір тих нескінченно багатьох неправильних поведінки часу виконання не може відбуватися.
Різниця між системами різних типів полягає в тому, що в тому, скільки, скільки складних режимів поведінки вони можуть виявити, не виникають. Системи слабкого типу, такі як Java, можуть довести лише основні речі. Наприклад, Java може довести, що метод, який вводиться як повернення a, String
не може повернути a List
. Але, наприклад, він може НЕ довести , що метод не буде не повертатися. Це також не може довести, що метод не кине виключення. І це не може довести, що воно не поверне неправильне String
- будь- String
який задовольнить перевірку типу. (І, звичайно, навіть null
задовольнить його.) Є навіть дуже прості речі , які Java не можуть довести, що саме тому у нас є винятки , наприклад ArrayStoreException
, ClassCastException
або все улюбленець, то NullPointerException
.
Більш потужні системи типу, як Agda, можуть також довести такі речі, як "поверне суму двох аргументів" або "повертає відсортовану версію списку, переданого як аргумент".
Тепер, що дизайнери Elm мають на увазі під твердженням, що вони не мають винятків під час виконання, - це те, що система типу Elm може довести відсутність (значної частини) режимів виконання, які в інших мовах не можуть бути доведені, щоб не відбувалися, і, таким чином, це може призвести до помилкової поведінки під час виконання (що в кращому випадку означає виняток, у гіршому випадку означає збій, а в гіршому - не крах, не виняток і просто мовчазно неправильний результат).
Отже, вони не говорять, що "ми не застосовуємо винятків". Вони говорять, що "типи, що були типовими винятками у типових мовах, з якими типичні програмісти, що приїжджають до Elm, мають досвід роботи, потрапляють у систему типу". Звичайно, хтось із Ідріса, Агди, Гуру, Епіграму, Ізабел / HOL, Coq або подібних мов побачить В'яза як досить слабкого в порівнянні. Заява більш орієнтована на типових програмістів Java, C♯, C ++, Objective-C, PHP, ECMAScript, Python, Ruby, Perl….