อันดับแรกคำอธิบายศัพท์: ตำแหน่งลบและบวกมาจากตรรกะ พวกเขาจะเกี่ยวกับ assymetry ในตรรกะ connectives: ใน⇒ Bทำงานแตกต่างจากB สิ่งที่คล้ายกันเกิดขึ้นในทฤษฎีหมวดหมู่ซึ่งเราบอกว่าcontravariantและcovariantแทนที่จะเป็นลบและบวกตามลำดับ ในวิชาฟิสิกส์พวกเขาพูดถึงปริมาณที่ทำหน้าที่ "covariantly" และ "contravariantly เช่นกันดังนั้นนี่เป็นปรากฏการณ์ทั่วไปมากโปรแกรมเมอร์อาจคิดว่าพวกเขาเป็น" อินพุต "และ" เอาท์พุท "A ⇒ BAB
ตอนนี้เข้าสู่ประเภทข้อมูลอุปนัย
คิดว่าประเภทข้อมูลอุปนัยเป็นชนิดของโครงสร้างเกี่ยวกับพีชคณิต: การก่อสร้างมีการดำเนินงานที่ใช้องค์ประกอบของTเป็นข้อโต้แย้งและการผลิตองค์ประกอบใหม่ของT นี่คล้ายกับพีชคณิตสามัญ: การเพิ่มจะใช้สองตัวเลขและสร้างตัวเลขTTT
ในพีชคณิตมันเป็นธรรมเนียมที่การดำเนินการใช้จำนวน จำกัด ของการขัดแย้งและในกรณีส่วนใหญ่จะใช้ศูนย์ (คงที่) หนึ่ง (unary) หรือสอง (ไบนารี) อาร์กิวเมนต์ มันสะดวกที่จะพูดคุยเรื่องนี้สำหรับผู้สร้างประเภทข้อมูล สมมติว่าc
เป็นตัวสร้างสำหรับประเภทข้อมูลT
:
- ถ้า
c
เป็นค่าคงที่เราสามารถคิดว่ามันเป็นฟังก์ชั่นunit -> T
หรือเท่ากัน(empty -> T) -> T
,
- ถ้า
c
เป็นเอกเราสามารถคิดว่ามันเป็นฟังก์ชั่นT -> T
หรือเท่ากัน(unit -> T) -> T
,
- ถ้า
c
เป็นไบนารีเราสามารถคิดว่ามันเป็นฟังก์ชั่นT -> T -> T
หรือเท่ากันT * T -> T
หรือเท่ากัน(bool -> T) -> T
,
- ถ้าเราต้องการนวกรรมิก
c
ที่ใช้เจ็ดข้อโต้แย้งเราสามารถดูมันเป็นฟังก์ชั่น(seven -> T) -> T
ที่seven
บางประเภทที่กำหนดไว้ก่อนหน้านี้มีเจ็ดองค์ประกอบ
- เรายังสามารถมีผู้สร้างซึ่งจะมีข้อโต้แย้งวท์หลายอย่างมากมายที่จะเป็นฟังก์ชั่น
c
(nat -> T) -> T
ตัวอย่างเหล่านี้แสดงให้เห็นว่ารูปแบบทั่วไปของตัวสร้างควรเป็น
c : (A -> T) -> T
ที่เราเรียกarityของและเราคิดว่าเป็นตัวสร้างที่จะนำข้อโต้แย้ง -many ประเภทการผลิตองค์ประกอบของA
c
c
A
T
T
นี่คือสิ่งที่สำคัญมาก: ต้องกำหนด arities ก่อนที่เราจะกำหนดT
หรืออื่น ๆ ที่เราไม่สามารถบอกได้ว่าผู้สร้างควรจะทำอะไร หากมีคนพยายามที่จะมีตัวสร้าง
broken: (T -> T) -> T
ถ้าอย่างนั้นคำถาม "มีอาร์กิวเมนต์กี่ข้อbroken
?" ไม่มีคำตอบที่ดี คุณอาจลองตอบด้วยคำว่า "มันต้องใช้T
อาร์กิวเมนต์หลายอย่าง" แต่จะไม่ทำเพราะT
ยังไม่ได้กำหนด เราอาจพยายามออกจาก cunundrum โดยใช้ทฤษฎี fixed-point แฟนซีเพื่อค้นหาประเภทT
และฟังก์ชั่นการฉีด(T -> T) -> T
และจะประสบความสำเร็จ แต่เราจะทำลายหลักการการเหนี่ยวนำT
ไปพร้อมกัน ดังนั้นจึงเป็นความคิดที่ดีที่จะลองทำสิ่งนี้
λโวลต์λ ⋅ วีc
B
c : B * (A -> T) -> T
อันที่จริงการก่อสร้างจำนวนมากสามารถเขียนในลักษณะนี้ แต่ไม่ทั้งหมดที่เราต้องการอีกหนึ่งขั้นตอนคือเราควรจะอนุญาตให้A
ไปขึ้นอยู่บนB
:
c : (∑ (x : B), A x -> T) -> T
นี่คือรูปแบบสุดท้ายของตัวสร้างสำหรับประเภทอุปนัย นอกจากนี้ยังเป็นสิ่งที่ประเภท W อย่างแม่นยำ รูปแบบเป็นเรื่องธรรมดามากที่เราต้องการเพียงคอนสตรัคเตอร์เดียวc
! แน่นอนถ้าเรามีสองคน
d' : (∑ (x : B'), A' x -> T) -> T
d'' : (∑ (x : B''), A'' x -> T) -> T
จากนั้นเราสามารถรวมเข้าเป็นหนึ่งเดียว
d : (∑ (x : B), A x -> T) -> T
ที่ไหน
B := B' + B''
A(inl x) := A' x
A(inr x) := A'' x
โดยวิธีการถ้าเราแกงรูปแบบทั่วไปที่เราเห็นว่ามันเทียบเท่า
c : ∏ (x : B), ((A x -> T) -> T)
ซึ่งใกล้เคียงกับสิ่งที่ผู้คนเขียนลงไปในผู้ช่วยพิสูจน์ ผู้ช่วยพิสูจน์ให้เราจดสิ่งก่อสร้างด้วยวิธีที่สะดวก แต่สิ่งเหล่านี้เทียบเท่ากับแบบทั่วไปข้างต้น (แบบฝึกหัด!)
A
และระเบิดสแต็กในที่สุด