이 진술을 이해하려면 먼저 정적 유형 시스템이 우리를 구입하는 것을 이해해야합니다. 본질적으로, 정적 타입 시스템이 우리에게주는 무슨, 보증이다 IFF에 프로그램 유형 검사, 런타임 행동의 특정 클래스가 발생할 수 없습니다.
불길하게 들린다. 글쎄, 타입 체커는 정리 체커와 비슷합니다. (실제로, 커리 하워드 이소 형에 따르면 그것들은 똑같습니다.) 정리에 대해 매우 특이한 것은 정리를 증명할 때 정리가 말하는 것을 더 이상 증명하지 못한다는 것입니다. 예를 들어, 누군가 "이 프로그램이 올바른 것으로 입증되었습니다"라고 말할 때 항상 " '정확한 정의하십시오"라고 요청해야합니다.) 유형 시스템의 경우에도 마찬가지입니다. "프로그램이 형식에 안전합니다"라고 할 때 가능한 오류가 발생하지 않는다는 의미입니다 . 우리는 유형 시스템이 우리에게 예방할 것을 약속하는 오류가 발생할 수 없다고 말할 수 있습니다.
따라서 프로그램은 다양한 런타임 동작을 무한히 가질 수 있습니다. 그 중에서도 무한히 많은 것이 유용하지만, 무한히 많은 것도 "올바르지 않다"( "정확도"의 다양한 정의에 대해)입니다. 정적 유형 시스템을 사용하면 무한한 많은 잘못된 런타임 동작이 발생하는 유한하고 고정 된 특정 집합을 증명할 수 있습니다.
서로 다른 유형 시스템의 차이점은 기본적으로 어느 정도, 얼마나 많은, 얼마나 복잡한 런타임 동작이 발생하지 않는지에 있습니다. Java와 같은 약한 유형 시스템은 매우 기본적인 것만 증명할 수 있습니다. 예를 들어, Java는 a를 반환하는 것으로 입력 된 메서드가 a를 반환 할 String
수 없음을 증명할 수 있습니다 List
. 그러나, 예를 들어, 그것은 할 수 없는 방법은 반환하지 않습니다 것을 증명한다. 또한 메소드가 예외를 발생시키지 않음을 증명할 수 없습니다. 그리고는 반환하지 않습니다 것을 증명할 수 잘못 String
- 어느 String
유형 검사를 만족시킬 것입니다. (물론, null
그것을 만족시킬 수도 있습니다.) Java가 증명할 수없는 매우 간단한 것들이 있기 ArrayStoreException
때문에 ClassCastException
, 또는 모두가 좋아하는 NullPointerException
.
Agda와 같은보다 강력한 형식 시스템은 "두 인수의 합을 반환합니다"또는 "인수로 전달 된 목록의 정렬 된 버전을 반환합니다"와 같은 것을 증명할 수 있습니다.
이제 Elm의 디자이너가 런타임 예외가 없다는 진술에 의해 의미하는 것은 Elm의 유형 시스템이 다른 언어 에서는 발생 하지 않는 것으로 입증 될 수 없는 런타임 동작의 부재가 있음을 증명할 수 있다는 것입니다. 런타임에 잘못된 동작 (가장 좋은 경우 예외를 의미하고, 최악의 경우 충돌을 의미하며, 최악의 경우 모두 충돌 없음, 예외 없음, 조용히 잘못된 결과)을 의미합니다.
그래서, 그들은되어 있지 "우리가 예외를 구현하지 않습니다"라고. 그들은 Elm에 온 전형적인 프로그래머들이 경험할 수있는 전형적인 언어에서 런타임 예외가 될 수있는 것들이 타입 시스템에 의해 잡히고 있다고 말합니다. 물론 Idris, Agda, Guru, Epigram, Isabelle / HOL, Coq 또는 이와 유사한 언어에서 온 사람은 Elm을 비교할 때 상당히 약한 것으로 간주합니다. 이 문장은 일반적인 Java, C♯, C ++, Objective-C, PHP, ECMAScript, Python, Ruby, Perl,… 프로그래머를 대상으로합니다.