Để hiểu được tuyên bố này, trước tiên chúng ta phải hiểu hệ thống kiểu tĩnh mua gì cho chúng ta. Về bản chất, những gì một hệ thống kiểu tĩnh mang lại cho chúng ta, là một sự đảm bảo: nếu kiểm tra loại chương trình, một lớp hành vi thời gian chạy nhất định không thể xảy ra.
Nghe có vẻ đáng ngại. Vâng, một trình kiểm tra loại tương tự như trình kiểm tra định lý. (Trên thực tế, theo Curry-Howard-Isomorphism, chúng giống nhau.) Một điều rất đặc biệt về các định lý là khi bạn chứng minh một định lý, bạn chứng minh chính xác những gì định lý nói, không hơn. (Đó là ví dụ, tại sao, khi ai đó nói "Tôi đã chứng minh chương trình này đúng", bạn nên luôn luôn hỏi "vui lòng xác định 'chính xác" ".) Điều tương tự cũng đúng với các hệ thống loại. Khi chúng tôi nói "một chương trình là loại an toàn", điều chúng tôi muốn nói là không có lỗi nào có thể xảy ra. Chúng tôi chỉ có thể nói rằng các lỗi hệ thống loại hứa với chúng tôi sẽ không thể xảy ra.
Vì vậy, các chương trình có thể có vô số hành vi thời gian chạy khác nhau. Trong số đó, vô số những cái là hữu ích, nhưng cũng có vô số cái là "không chính xác" (đối với các định nghĩa khác nhau về "tính chính xác"). Một hệ thống kiểu tĩnh cho phép chúng tôi chứng minh rằng một tập hợp hữu hạn, cố định của vô số những hành vi thời gian chạy không chính xác có thể xảy ra.
Sự khác biệt giữa các hệ thống loại khác nhau về cơ bản là trong đó, bao nhiêu và các hành vi thời gian chạy phức tạp mà chúng có thể chứng minh là không xảy ra. Các hệ thống loại yếu như Java chỉ có thể chứng minh những điều rất cơ bản. Ví dụ, Java có thể chứng minh rằng một phương thức được gõ là trả về String
không thể trả về a List
. Nhưng, ví dụ, nó không thể chứng minh rằng phương thức sẽ không trả về. Nó cũng không thể chứng minh rằng phương pháp sẽ không ném ngoại lệ. Và nó không thể chứng minh rằng nó sẽ không trả về sai String
- bất kỳ String
sẽ thỏa mãn trình kiểm tra loại. (Và, tất nhiên, thậm chí null
sẽ làm hài lòng nó là tốt.) Thậm chí còn có những điều rất đơn giản mà Java không thể chứng minh, đó là lý do chúng tôi có trường hợp ngoại lệ như ArrayStoreException
, ClassCastException
hoặc tất cả mọi người yêu thích, các NullPointerException
.
Các hệ thống loại mạnh hơn như Agda cũng có thể chứng minh những thứ như "sẽ trả về tổng của hai đối số" hoặc "trả về phiên bản đã sắp xếp của danh sách được truyền dưới dạng đối số".
Bây giờ, ý nghĩa của các nhà thiết kế của Elm khi tuyên bố rằng họ không có ngoại lệ về thời gian chạy là hệ thống loại của Elm có thể chứng minh sự vắng mặt của (một phần đáng kể) các hành vi thời gian chạy mà trong các ngôn ngữ khác không thể được chứng minh là không xảy ra và do đó có thể dẫn đến hành vi sai lầm trong thời gian chạy (trong trường hợp tốt nhất có nghĩa là một ngoại lệ, trong trường hợp xấu hơn có nghĩa là một sự cố và trong trường hợp xấu nhất có nghĩa là không có sự cố, không có ngoại lệ và chỉ là kết quả sai lầm âm thầm).
Vì vậy, họ không nói rằng "chúng tôi không thực hiện các ngoại lệ". Họ đang nói rằng "những thứ sẽ là ngoại lệ thời gian chạy trong các ngôn ngữ điển hình mà các lập trình viên điển hình đến với Elm sẽ có kinh nghiệm, bị hệ thống loại bắt gặp". Tất nhiên, ai đó đến từ Idris, Agda, Guru, Epigram, Isabelle / HOL, Coq hoặc các ngôn ngữ tương tự sẽ thấy Elm khá yếu khi so sánh. Tuyên bố này nhắm nhiều hơn vào các lập trình viên Java, C♯, C ++, Objective-C, PHP, ECMAScript, Python, Ruby, Perl, giật.