Aby zrozumieć to stwierdzenie, musimy najpierw zrozumieć, co kupuje system typu statycznego. Zasadniczo to, co daje nam system typów statycznych, jest gwarancją: jeśli sprawdzimy typ programu, nie będzie mogła wystąpić pewna klasa zachowań uruchomieniowych.
To brzmi złowieszczo. Sprawdzanie typów jest podobne do sprawdzania twierdzeń. (W rzeczywistości, zgodnie z izomorfizmem Curry'ego-Howarda, są one tym samym.) Jedną z osobliwości twierdzeń jest to, że gdy udowodnisz twierdzenie, udowodnisz dokładnie to, co mówi to twierdzenie, nie więcej. (To na przykład dlatego, gdy ktoś mówi „Udowodniłem, że ten program jest poprawny”, zawsze powinieneś zapytać „proszę zdefiniować„ poprawny ””.) To samo dotyczy systemów typu. Kiedy mówimy „program jest typu bezpieczne”, co mamy na myśli, to nie , że nie może dojść do ewentualnego błędu. Możemy tylko powiedzieć, że błędy, które system typów obiecuje nam zapobiec, nie mogą wystąpić.
Programy mogą mieć nieskończenie wiele różnych zachowań w środowisku wykonawczym. Spośród nich nieskończenie wiele jest przydatnych, ale także nieskończenie wiele z nich jest „niepoprawnych” (dla różnych definicji „poprawności”). System typu statycznego pozwala nam udowodnić, że nie może wystąpić określony skończony, ustalony zestaw tych nieskończenie wielu niepoprawnych zachowań środowiska uruchomieniowego.
Różnica między różnymi systemami typów polega zasadniczo na tym, w ilu i jak złożonym zachowaniu środowiska wykonawczego mogą się one nie pojawić. Słabe systemy typu, takie jak Java, mogą udowodnić tylko bardzo podstawowe rzeczy. Na przykład Java może udowodnić, że metoda, która jest typowana jako zwracająca a, String
nie może zwrócić a List
. Ale, na przykład, może nie okazać się, że metoda ta nie będzie powrotu. Nie może również udowodnić, że metoda nie zgłosi wyjątku. I nie może udowodnić, że nie zwróci zła String
- każdy String
spełni wymagania sprawdzania typu. (I oczywiście nawetnull
będzie go zadowolić, jak również.) Istnieją nawet bardzo proste rzeczy, że Java nie może udowodnić, dlatego mamy wyjątki, takie jak ArrayStoreException
, ClassCastException
czy wszyscy ulubione The NullPointerException
.
Potężniejsze systemy typu, takie jak Agda, mogą również udowodnić, że „zwróci sumę dwóch argumentów” lub „zwraca posortowaną wersję listy przekazaną jako argument”.
Teraz projektanci Elm mają na myśli stwierdzenie, że nie mają wyjątków w czasie wykonywania, że system typów Elma może udowodnić brak (znacznej części) zachowań w czasie wykonywania, których w innych językach nie można udowodnić, a zatem mogą prowadzić do błędnego zachowania w czasie wykonywania (co w najlepszym przypadku oznacza wyjątek, w gorszym przypadku oznacza awarię, aw najgorszym ze wszystkich oznacza brak awarii, wyjątek i po prostu cicho zły wynik).
Tak, są one nie mówią „nie realizować wyjątki”. Mówią „rzeczy, które byłyby wyjątkami w czasie wykonywania w typowych językach, z którymi typowi programiści przybywający do Elm mieliby do czynienia, są przechwytywani przez system typów”. Oczywiście, ktoś pochodzący z Idris, Agdy, Guru, Epigram, Isabelle / HOL, Coq lub podobnych języków, zobaczy Elma jako dość słabego w porównaniu. Instrukcja jest bardziej skierowana do typowych programistów Java, C♯, C ++, Objective-C, PHP, ECMAScript, Python, Ruby, Perl,…