Untuk memahami pernyataan ini, pertama-tama kita harus memahami apa yang dibeli oleh sistem tipe statis. Pada dasarnya, apa yang diberikan oleh sistem tipe statis adalah jaminan: jika tipe program memeriksa, kelas perilaku runtime tertentu tidak dapat terjadi.
Kedengarannya menyenangkan. Ya, pemeriksa tipe mirip dengan pemeriksa teorema. (Sebenarnya, menurut Curry-Howard-Isomorphism, mereka adalah hal yang sama.) Satu hal yang sangat aneh tentang teorema adalah ketika Anda membuktikan teorema, Anda membuktikan dengan tepat apa yang dikatakan teorema, tidak lebih. (Itu misalnya, mengapa, ketika seseorang mengatakan "Saya telah membuktikan program ini benar", Anda harus selalu bertanya "tolong jelaskan 'benar'".) Hal yang sama berlaku untuk sistem ketik. Ketika kita mengatakan "suatu program adalah tipe-aman", yang kami maksud bukanlah bahwa tidak ada kesalahan yang mungkin terjadi. Kita hanya bisa mengatakan bahwa kesalahan yang dijanjikan oleh sistem tipe kita untuk mencegah tidak terjadi.
Jadi, program dapat memiliki banyak perilaku runtime yang tak terhingga. Dari mereka, banyak yang tak terhingga berguna, tetapi juga yang tak terhingga banyak yang "salah" (untuk berbagai definisi "benar"). Suatu sistem tipe statis memungkinkan kita untuk membuktikan bahwa suatu himpunan terbatas yang pasti dan pasti dari banyak perilaku runtime yang tak terhingga tidak dapat terjadi.
Perbedaan antara sistem tipe yang berbeda pada dasarnya adalah di mana, berapa banyak, dan seberapa kompleks perilaku runtime yang mereka buktikan tidak terjadi. Sistem tipe lemah seperti Java hanya dapat membuktikan hal-hal yang sangat mendasar. Sebagai contoh, Java dapat membuktikan bahwa metode yang diketikkan sebagai mengembalikan String
tidak dapat mengembalikan a List
. Tapi, misalnya, dapat tidak membuktikan bahwa metode ini tidak akan tidak kembali. Itu juga tidak dapat membuktikan bahwa metode ini tidak akan memberikan pengecualian. Dan itu tidak dapat membuktikan bahwa itu tidak akan mengembalikan yang salah String
- ada yang String
akan memenuhi pemeriksa tipe. (Dan, tentu saja, bahkan null
akan memuaskan juga.) Bahkan ada hal-hal yang sangat sederhana bahwa Jawa tidak dapat membuktikan, itulah sebabnya mengapa kita memiliki pengecualian seperti ArrayStoreException
, ClassCastException
, atau semua orang favorit, yang NullPointerException
.
Sistem tipe yang lebih kuat seperti Agda juga dapat membuktikan hal-hal seperti "akan mengembalikan jumlah dari dua argumen" atau "mengembalikan versi daftar yang disortir sebagai argumen".
Sekarang, apa yang dimaksud oleh desainer Elm dengan pernyataan bahwa mereka tidak memiliki pengecualian runtime adalah bahwa sistem tipe Elm dapat membuktikan tidak adanya (sebagian besar dari) perilaku runtime yang dalam bahasa lain tidak dapat dibuktikan tidak terjadi dan dengan demikian dapat menyebabkan untuk perilaku yang salah saat runtime (yang dalam kasus terbaik berarti pengecualian, dalam kasus yang lebih buruk berarti crash, dan dalam kasus terburuk dari semua berarti tidak ada crash, tidak ada pengecualian, dan hanya hasil yang salah secara diam-diam).
Jadi, mereka tidak mengatakan "kami tidak menerapkan pengecualian". Mereka mengatakan "hal-hal yang akan menjadi pengecualian runtime dalam bahasa khas yang dialami oleh programmer khas Elm, ditangkap oleh sistem tipe". Tentu saja, seseorang yang datang dari Idris, Agda, Guru, Epigram, Isabelle / HOL, Coq, atau bahasa serupa akan melihat Elm sebagai sangat lemah dalam perbandingan. Pernyataan ini lebih ditujukan untuk programmer Java, C♯, C ++, Objective-C, PHP, ECMAScript, Python, Ruby, Perl,… programmer khas.