2013-02-11 2 views
6

type 선언과 newtype 선언 사이의 읽기 - 컴파일 실행 파이프 라인의 다양한 단계에서 차이점은 무엇입니까?타입과 newtype 간의 컴파일 시간과 실행 시간의 차이

내 가정은 그들이 동일한 시스템 설명서를 다운 컴파일이었다, 예를

type Name = String 
newtype Name_ = N String 

당신은 어디서든 String이 요구되는 Name을 사용할 수있는 유일한 차이점이 있다는 프로그램은, 타입 체크 할 때 그러나 동일한 정보를 인코딩하더라도 String이 예상되는 Name_을 사용하면 유형 검사기가 사용자에게 전화를 겁니다.

이 경우, 나는 다음과 같은 선언이 유효하지 말아야 어떤 이유 표시되지 않습니다, 때문에 나는이 질문을 부탁 해요 그러나

type List a = Either() (a, List a) 
newtype List_ a = L (Either() (a, List_ a)) 

는 유형 검사는 두 번째를 수용 하나는 거부하지만 첫 번째는 거부합니다. 왜 그런가요?

+10

컴파일 문제가 아니며 유형 검사 문제입니다. Haskell은 "equi-recursive types"보다는 "iso-recursive types"를 사용하기 때문에, 당신의 타입을 재귀 적으로 원한다면 어딘가에'data' 나'newtype'을 가져야 만합니다. 각 선택 항목에는 여러 가지 상반 관계가 있습니다. 이러한 시스템과 관련된 선택 사항에 대한 자세한 내용은 피어스 (Pierce)의 유형 및 프로그래밍 언어를 참조하십시오. – luqui

+2

감사합니다. Google에 무엇이 필요한지 알고 싶다면 "iso-recursive"및 "equi-recursive"라는 이름이 필요하다고 생각합니다! 응답을 변환하려는 경우이를 수락합니다. –

답변

4

Luqui의 의견은 답변이어야합니다. 하스켈에서 타입 동의어는 매크로보다 첫 번째 근사값입니다. 즉, 유형 검사기를 통해 완전히 평가 된 유형으로 확장됩니다. 유형 검사기는 무한 유형을 처리 할 수 ​​없으므로 하스켈에는 동등 재귀 유형이 없습니다.

newtypes은 GHC에서 핵심 언어의 등가 순환 유형으로 컴파일되는 iso-recursive 유형을 제공합니다. 하스켈은 GHC 코어가 아니므로 그러한 유형에 액세스 할 수 없습니다. Equi-recursive 유형은 유형 체커와 사람 모두와 작업하기가 조금 더 어렵지만 iso-recursive 유형은 동등한 성능을 제공합니다.

+0

감사합니다. Philip. GHC 코어가 동등 재귀 유형을 가지고 있다는 것을 이해하는 것이 옳은가요? 어떤 단계에서'newtype' 태그의 정보가 사라지나요? –

+0

전염병과 같은 핵을 피하십시오. 소금물로 말하면 모든 것을 가져 가십시오. GHC 코어에는 iso-recursive types이 있습니다. 그리고 newtype은 핵심에 존재하지 않습니다. 내 믿음은 미래에 유형 평등 제약 조건을 사용하는 것으로 대체 될 수 있다는 것이다. 그래서 Listest = a ((a (r)) ~ r => r') (이것을위한 기계 장치는 이미 존재한다). –

+0

@PhilipJF : [좀 더 복잡해졌습니다.] (http://hackage.haskell.org/trac/ghc/wiki/Commentary/Compiler/FC#Newtypesarecoercedtypes) 지금은 newtypes가 데이터 유형과 유형 equality axiom :'newtype T = MkT Int'는 axT : T ~ Int'를 생성합니다. 불행히도, 이것은 불건전하다 : 만약 우리가'family F a; 유형 인스턴스 F Int = Bool; 타입 인스턴스 F T = Char','Bool ~ F Int','F Int ~ F T','F T ~ Char'가 있습니다. 따라서'Bool ~ Char', 그리고 우리는 곤경에 빠졌습니다. [GeneralizedNewtypeDeriving'으로 실제로 자극을받을 수 있습니다.] (http://hackage.haskell.org/trac/ghc/ticket/1496) –