ใคร ๆ ก็สามารถอธิบายความแตกต่างระหว่าง:
- ประเภทข้อมูลพีชคณิต (ซึ่งฉันคุ้นเคยกับ)
- ประเภทข้อมูลพีชคณิตทั่วไป (สิ่งที่ทำให้พวกเขา generalized?)
- ประเภทอุปนัย (เช่น Coq)
(โดยเฉพาะอย่างยิ่งอุปนัยประเภท) ขอบคุณ
ใคร ๆ ก็สามารถอธิบายความแตกต่างระหว่าง:
(โดยเฉพาะอย่างยิ่งอุปนัยประเภท) ขอบคุณ
คำตอบ:
ชนิดข้อมูลเชิงพีชคณิตช่วยให้คุณกำหนดชนิดแบบเรียกซ้ำได้ แน่นอนว่าเรามีประเภทข้อมูล
สิ่งที่หมายถึงนี้ก็คือว่าเป็นชุดที่เล็กที่สุดที่สร้างขึ้นโดยไม่มีฉันลิตรและC o n sผู้ประกอบการ เราสามารถทำให้เป็นทางการได้โดยการกำหนดโอเปอเรเตอร์F ( X )
แล้วกำหนดเป็น
ทั่วไป ADT คือสิ่งที่เราได้รับเมื่อกำหนดประเภทผู้ประกอบการซ้ำ ตัวอย่างเช่นเราอาจกำหนดตัวสร้างประเภทต่อไปนี้:
ประเภทนี้หมายถึงองค์ประกอบของ is a tuple of s of length for some , since each time we go into the constructor the type argument is paired with itself. So we can define the operator we want to take a fixed point of as:
ประเภทอุปนัยใน Coq เป็นหลัก GADT ที่ดัชนีของผู้ประกอบการประเภทไม่ จำกัด ประเภทอื่น ๆ (ในตัวอย่างเช่น Haskell) แต่ยังสามารถทำดัชนีโดยค่าของทฤษฎีประเภท ซึ่งช่วยให้คุณกำหนดประเภทสำหรับรายการที่มีการจัดทำดัชนีแบบยาวและอื่น ๆ
bush
เรียกว่า GADT ฉันเคยเห็นพวกเขาเรียกว่าประเภทซ้อนหรือไม่ธรรมดา
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
List a
หากเราอนุญาตให้ Constructor ส่งคืนประเภทที่แตกต่างกันเรามี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 แต่มันลดภาระ syntax ของ GADT บ้างและมันสามารถนำไปสู่ข้อความแสดงข้อผิดพลาดที่ดีขึ้น