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))
는 유형 검사는 두 번째를 수용 하나는 거부하지만 첫 번째는 거부합니다. 왜 그런가요?
컴파일 문제가 아니며 유형 검사 문제입니다. Haskell은 "equi-recursive types"보다는 "iso-recursive types"를 사용하기 때문에, 당신의 타입을 재귀 적으로 원한다면 어딘가에'data' 나'newtype'을 가져야 만합니다. 각 선택 항목에는 여러 가지 상반 관계가 있습니다. 이러한 시스템과 관련된 선택 사항에 대한 자세한 내용은 피어스 (Pierce)의 유형 및 프로그래밍 언어를 참조하십시오. – luqui
감사합니다. Google에 무엇이 필요한지 알고 싶다면 "iso-recursive"및 "equi-recursive"라는 이름이 필요하다고 생각합니다! 응답을 변환하려는 경우이를 수락합니다. –