2014-08-28 6 views
8

role system and annotations에 유형 (및 데이터) 패밀리 매개 변수가 역할 nominal에 있어야하는 이유를 알고 있습니다. 내가 tyanominal 역할을 얻을 것이라고명목 유형 역할 및 데이터 패밀리

data family CoordinateRepresentation ty a :: * 

를 선언 할 때

그래서 나는 기대했다. (실제 예제는 관련된 데이터 패밀리입니다. 그러나 아무 것도 변경되지 않는다고 생각하기 때문에 그로 인한 추가 노이즈는 생략하고 있습니다.)

내가 예상하지 못한 것은

으로 변경했을 때입니다.

은 이름이없는 두 번째 유형 인수가 여전히 nominal 역할을 갖습니다.

왜 이런가요? data instance CoordinateRepresentation ... = ...은 신선한 생성자를 만들어야하기 때문에 안전하게 representational 역할을 얻을 수 없었습니까? 어떻게 그 생성자는 컴파일러가 볼 수없는 방식으로 nominal 역할에서 매개 변수를 사용할 수 있습니까? 오픈 시스템이고 별도의 편집이 있더라도 아직 이해가 안갑니다.

답변

6

첫 번째로 중요하지 않은 점 : 데이터 패밀리가 유형 변수로 선언되었거나 종류가 시그너처인지 여부는 현재 완전히 중요하지 않습니다. 동일한 문법에 불과합니다. 데이터 가족 선언에 the GHC User's Guide에서 :

그냥 GADT declarations 명명 된 인수와 같은

는 완전히 선택 사항입니다 [...]

주요 포인트가 남아 있고, this GHC trac thread에서 논의되고있다. 짧은 요약 : 데이터/유형 계열에 대한 역할 추론 및/또는 역할 주석을 추가하는 것이 가능하지만 아직 구현되지 않았습니다.

+0

아, 알겠습니다. 두 번째 구문은 유형 패밀리의 "패턴 일치"부분을 첫 번째 인수로 제한하고 결과적으로'* -> * '가 어떤 의미에서는 "보통"이되도록 요구할 것이라고 예상했으나 그렇지 않습니다. –