답변:
CL 유형 시스템은 Haskell 시스템보다 표현력 이 뛰어납니다. 예를 들어, (or (integer 1 10) (integer 20 30))
값에 대한 유형 을 가질 수 있습니다 1,2,...9,10,20,21,...,30
.
당신이 그들의 "노트"를 무시할 수 있도록 그러나 리스프 컴파일러는, 당신의 목구멍 형 안전에 대한 이해를 강요하지 않는다 - 당신의 자신의 위험에 .
즉, 모든 값 유형을 선언하고 필요한 모든 유형이 유추되었는지 확인하여 Haskell을 Lisp로 작성할 수 있습니다 (그러나 말할 필요도 있음). 우선 Haskell을 사용하는 것이 더 쉽습니다.
기본적으로 강력한 정적 타이핑을 원하면 Haskell 또는 OCaml을 사용하고 강력한 동적 타이핑을 원하면 Lisp를 사용하십시오. 약한 정적 입력을 원하면 C를 사용하고 약한 동적 입력을 원하면 Perl / Python을 사용하십시오. 각 경로에는 장단점과 단점이 있으므로 모든 것을 배우면 도움이됩니다.
Object
하거나 유형 트리의 루트가 무엇이든 선언하여 대부분의 정적으로 유형이 지정된 언어에서 동일한 작업을 수행 할 수 있습니다 . 이다 적은 당신이 있기 때문에, 표현 박탈 의 옵션을 특정 변수가 특정 값을 포함 할 수 있음을 말하는.
Typed Racket은 Haskell과 매우 다릅니다. Lisp 및 Scheme의 유형 시스템과 실제로는 전통적으로 유형이 지정되지 않은 언어 생태계의 유형 시스템은 다른 유형 시스템이 기존의 유형이 지정되지 않은 코드와 상호 운용 되지 않는다는 기본 목표를 가지고 있습니다 . 예를 들어 Typed Racket은 다양한 라켓 관용구를 수용하기 위해 완전히 새로운 타이핑 규칙을 도입했습니다. 이 기능을 고려하십시오.
(define (first some-list)
(if (empty? some-list)
#f
(car some-list)))
비어 있지 않은 목록의 경우 첫 번째 요소를 반환합니다. 빈 목록의 경우 false를 반환합니다. 이것은 형식화되지 않은 언어에서 일반적입니다. 유형이 지정된 언어는 랩퍼 유형을 사용 Maybe
하거나 빈 경우에 오류를 발생시킵니다. 이 함수에 유형을 추가하려면 어떤 유형을 사용해야합니까? [a] -> a
거짓을 반환 할 수 있기 때문에 하스켈 표기법 이 아닙니다 . 또한 [a] -> Either a Boolean
(1) 임의의 부울이 아닌 빈 경우에 항상 false를 반환하고 (2) 두 유형 중 하나가 요소를 감싸고 Left
false로 Right
만들고 실제 요소에 도달하려면 "둘 중 하나를 풀어야"하기 때문에 그렇지 않습니다. 대신, 값은 진정한 합집합을 반환합니다-래핑 생성자가 없으며 어떤 경우에는 한 유형을 반환하고 다른 경우에는 다른 유형을 반환합니다. Typed Racket에서 이것은 union 타입 생성자로 표현됩니다 :
(: first (All (A) (-> (Listof A) (U A #f))))
(define (first some-list)
(if (empty? some-list)
#f
(car some-list)))
유형 (U A #f)
은 함수가 목록의 요소를 리턴하거나 랩핑 Either
인스턴스 없이 false를 리턴 할 수 있음을 나타냅니다 . 유형 검사기는 some-list
유형 (Pair A (Listof A))
또는 비어있는 목록을 유추 할 수 있으며, if 문의 두 가지 분기에서 어떤 경우 인지 알 수 있습니다. 유형 검사기는 (car some-list)
표현식 에서 if 조건이 보장하기 때문에 목록 에 유형이 있어야 함 을 알고 (Pair A (Listof A))
있습니다. 이를 발생 유형 이라고 하며 유형이 지정되지 않은 코드에서 유형이 지정된 코드로 쉽게 전환 할 수 있도록 설계되었습니다.
문제는 마이그레이션입니다. 형식화되지 않은 라켓 코드가 많이 있으며 Typed Racket을 사용하면 좋아하는 형식화되지 않은 라이브러리를 모두 포기하고 코드베이스에 유형을 추가하는 데 한 달을 소비 할 수는 없습니다. 이 문제는 기존 코드베이스에 유형을 점진적으로 추가 할 때마다 적용됩니다 . 이러한 아이디어를 자바 스크립트로 적용하려면 TypeScript 및 해당 유형을 참조하십시오.
점진적 형식 시스템은 일반적인 형식화되지 않은 관용구를 처리하고 기존 형식화되지 않은 코드와 상호 작용하기위한 도구를 제공해야합니다. 그렇지 않으면 Clojure 예제를 위해 "더 이상 Core.typed를 사용하지 않는 이유"를 참조하십시오 .