답변:
대수 데이터 유형을 사용하면 유형을 재귀 적으로 정의 할 수 있습니다. 구체적으로, 데이터 유형이 있다고 가정
이것은 가 및 연산자에 의해 생성 된 가장 작은 집합 이라는 것을 의미 합니다. 연산자 정의하여이를 공식화 할 수 있습니다.
그런 다음 를 다음과 같이 정의하십시오.
일반화 ADT는 타입 정의 할 때 우리가 무엇을 얻을 연산자를 재귀. 예를 들어 다음 유형 생성자를 정의 할 수 있습니다.
이 유형 수단의 요소 것을 의 튜플이다 길이의 일부 , 각 시간 이후 우리가 들어갈 유형의 인수가 자체와 페어링되어 생성자 . 따라서 고정 소수점을 원하는 연산자를 다음과 같이 정의 할 수 있습니다.a 2 n n N e s t
Coq의 귀납적 유형은 본질적으로 GADT이며, 유형 연산자의 색인은 다른 유형 (예 : Haskell에서와 같이)으로 제한되지 않고 유형 이론의 값 으로 색인화 될 수도 있습니다 . 이를 통해 길이 인덱스 목록 등에 유형을 지정할 수 있습니다.
bush
. 나는 그것들을 중첩 또는 비정규 유형이라고 불렀습니다.
bush a
? 이 예에서 Nest Leaf(a) Leaf(a) Leaf(a) Leaf(a)
, 또는 Nest ((Nest Leaf(a) Leaf(a)) (Nest Leaf(a) Leaf(a)))
세트의 한 예입니까?
다음과 같은 대수 데이터 유형을 고려하십시오.
data List a = Nil | Cons a (List a)
데이터 유형에서 각 생성자의 반환 유형은 모두 동일 Nil
하며 Cons
모두 return List a
입니다. 생성자가 다른 유형을 반환하도록 허용하면 GADT가 있습니다 .
data Empty -- this is an empty data declaration; Empty has no constructors
data NonEmpty
data NullableList a t where
Vacant :: NullableList a Empty
Occupied :: a -> NullableList a b -> NullableList a NonEmpty
Occupied
유형이있는 a -> NullableList a b -> NullableList a NonEmpty
반면 Cons
유형이 a -> List a -> List a
있습니다. 이 NonEmpty
용어는 용어가 아니라 유형입니다. 또 다른 예:
data Zero
data Succ n
data SizedList a t where
Alone :: SizedList a Zero
WithFriends :: a -> SizedList a n -> SizedList a (Succ n)
종속 유형이있는 프로그래밍 언어의 유도 유형은 생성자의 리턴 유형이 인수의 값 (유형이 아닌)에 종속되도록합니다.
Inductive Parity := Even | Odd.
Definition flipParity (x:Parity) : Parity :=
match x with
| Even => Odd
| Odd => Even
end.
Fixpoint getParity (x:nat) : Parity :=
match x with
| 0 => Even
| S n => flipParity (getParity n)
end.
(*
A ParityNatList (Some P) is a list in which each member
is a natural number with parity P.
*)
Inductive ParityNatList : option Parity -> Type :=
Nil : forall P, ParityNatList P
| Cons : forall (x:nat) (P:option Parity),
ParityNatList P -> ParityNatList
(match P, getParity x with
| Some Even, Even => Some Even
| Some Odd, Odd => Some Odd
| _, _ => None
end).
참고 사항 : GHC에는 값 생성자를 유형 생성자로 취급하는 메커니즘이 있습니다. 이는 Coq의 종속 유도 유형과 동일하지 않지만 GADT의 구문 부담을 다소 줄이고 오류 메시지를 개선 할 수 있습니다.