수색…


소개

TypeFamilies 언어 확장을 통해 프로그래머는 유형 수준 함수를 정의 할 수 있습니다. GADT 타입이 아닌 생성자와 타입 함수를 구별하는 것은 타입 함수의 파라미터가 비 파라 메트릭이 될 수있는 반면 타입 생성자의 파라미터는 항상 파라 메트릭이 될 수 있다는 것입니다. 이 구별은 GeneralizedNewTypeDeriving 확장의 정확성에 중요합니다. 이 구별을 설명하기 위해 Haskell에서 역할이 소개됩니다.

비고

SafeNewtypeDeriving 도 참조하십시오.

명목상의 역할

Haskell Wiki 는 타입 함수의 매개 변수가 아닌 매개 변수의 예를 보여줍니다 :

type family Inspect x
type instance Inspect Age = Int    
type instance Inspect Int = Bool

여기서 x 는 타입 인자에 Inspect 를 적용한 결과를 결정하기 위해 비 파라 메 트릭입니다. 타입 함수는 x 를 검사해야합니다.

이 경우, x 의 역할은 공칭입니다. RoleAnnotations 확장을 사용하여 명시 적으로 역할을 선언 할 수 있습니다.

type role Inspect nominal

대표적인 역할

유형 함수의 매개 변수 매개 변수의 예는 다음과 같습니다.

data List a = Nil | Cons a (List a)

type family DoNotInspect x
type instance DoNotInspect x = List x

DoNotInspect 를 형식 인수에 적용한 결과를 결정하기 위해 x 를 검사 할 필요가 없기 때문에 x 는 매개 변수입니다.

이 경우, x의 역할은 표상 적이다. RoleAnnotations 확장을 사용하여 명시 적으로 역할을 선언 할 수 있습니다.

type role DoNotInspect representational

팬텀 역할

팬텀 유형 매개 변수 에는 팬텀 역할이 있습니다. 팬텀 역할은 명시 적으로 선언 할 수 없습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow