ประเภทไม่ได้ตั้งค่า
คุณจะเห็นว่าทฤษฎีเซตมีคุณสมบัติหลายอย่างที่ไม่สามารถใช้กับประเภทและในทางกลับกันได้ ตัวอย่างเช่นวัตถุที่มีประเภทที่ยอมรับเป็นหนึ่งเดียว อาจเป็นตัวอย่างของประเภทที่แตกต่างกัน แต่มีเพียงหนึ่งประเภทเท่านั้นที่ใช้เพื่อสร้างอินสแตนซ์ ทฤษฎีเซตไม่มีแนวคิดเกี่ยวกับเซต "บัญญัติ"
ทฤษฎีเซตช่วยให้คุณสร้างชุดย่อยได้ทันทีหากคุณมีกฎที่อธิบายสิ่งที่เป็นของชุดย่อย ทฤษฎีประเภทโดยทั่วไปไม่อนุญาตสิ่งนี้ ในขณะที่ภาษาส่วนใหญ่จะมีNumber
ประเภทหรือสิ่งที่คล้ายกันที่พวกเขาไม่ได้มีEvenNumber
ประเภทหรือมันจะตรงไปตรงมาเพื่อสร้าง ฉันหมายความว่ามันง่ายพอที่จะกำหนดประเภทของตัวเอง แต่Number
s ที่มีอยู่ใด ๆที่เกิดขึ้นแม้จะไม่ถูกแปลงอย่างน่าอัศจรรย์เป็นEvenNumber
s
ที่จริงแล้วการบอกว่าคุณสามารถ "สร้าง" ส่วนย่อยนั้นไม่ตรงตามความเป็นจริงเพราะเซตเป็นสัตว์ชนิดต่าง ๆ โดยสิ้นเชิง ในทฤษฎีเซตเซตย่อยเหล่านั้นมีอยู่แล้วในทุกรูปแบบไม่สิ้นสุดที่คุณสามารถกำหนดได้ ในทฤษฎีประเภทเรามักจะคาดหวังว่าจะจัดการกับจำนวน จำกัด (ถ้ามีขนาดใหญ่) ประเภทในเวลาใดก็ตาม ประเภทเดียวที่ถูกกล่าวว่ามีอยู่นั้นเป็นประเภทที่เราได้กำหนดไว้จริงไม่ใช่ทุกประเภทที่เราสามารถกำหนดได้
ชุดจะได้รับอนุญาตให้โดยตรงหรือโดยอ้อมประกอบด้วยตัวเอง บางภาษาเช่น Python ให้ประเภทที่มีโครงสร้างปกติน้อยกว่า (ใน Python type
ประเภทที่เป็นที่ยอมรับของคือtype
และobject
ถือเป็นตัวอย่างของobject
) ในทางกลับกันภาษาส่วนใหญ่ไม่อนุญาตให้ผู้ใช้กำหนดประเภทเพื่อมีส่วนร่วมในกลอุบายประเภทนี้
โดยทั่วไปจะได้รับอนุญาตให้ทับซ้อนกันโดยที่ไม่ได้อยู่ในชุดอื่น นี่เป็นเรื่องแปลกในทฤษฎีประเภทแม้ว่าบางภาษาจะสนับสนุนในรูปแบบของการสืบทอดหลาย ๆ ภาษาอื่นเช่น Java อนุญาตเฉพาะรูปแบบที่ จำกัด นี้หรือไม่อนุญาตทั้งหมด
มีประเภทที่ว่างเปล่าอยู่ (เรียกว่าประเภทด้านล่าง ) แต่ภาษาส่วนใหญ่ไม่รองรับหรือไม่ถือว่าเป็นประเภทที่มีระดับ "ประเภทที่มีประเภทอื่น ๆ ทั้งหมด" ก็มีอยู่ (เรียกว่าประเภทด้านบน ) และได้รับการสนับสนุนอย่างกว้างขวางซึ่งแตกต่างจากทฤษฎีเซต
หมายเหตุ : ก่อนหน้านี้นักวิจารณ์บางคนชี้ให้เห็น (ก่อนที่จะย้ายกระทู้ไปคุย) มันเป็นไปได้ที่จะสร้างแบบจำลองประเภทด้วยทฤษฎีเซตและมาตรฐานทางคณิตศาสตร์อื่น ๆ ตัวอย่างเช่นคุณสามารถสร้างแบบจำลองการเป็นสมาชิกแบบสัมพันธ์แทนที่จะสร้างแบบจำลองเป็นชุด แต่ในทางปฏิบัติสิ่งนี้ง่ายกว่ามากหากคุณใช้ทฤษฎีหมวดหมู่แทนทฤษฎีเซต นี่คือวิธีที่ Haskell จำลองทฤษฎีชนิดของมันตัวอย่างเช่น
ความคิดของ "subtyping" นั้นค่อนข้างแตกต่างจากแนวคิดของ "subset" หากX
เป็นประเภทย่อยY
หมายถึงเราสามารถทดแทนอินสแตนซ์ของY
สำหรับอินสแตนซ์ของX
และโปรแกรมจะยังคง "ทำงาน" ในบางกรณี นี่เป็นพฤติกรรมมากกว่าโครงสร้างแม้ว่าบางภาษา (เช่น Go, Rust, arguably C) ได้เลือกแบบหลังเพื่อความสะดวกไม่ว่าจะเป็นโปรแกรมเมอร์หรือการใช้ภาษา
a
และb
เป็นสมาชิกของประเภทนั้นดังที่ Killian Forth กล่าวถึง Myclass isomorphicกับระเบียนที่มีเขตข้อมูลa
และb
ประเภทint
และdouble
- คุณสามารถบันทึกเช่นนั้นและเปลี่ยนเป็น เป็นตัวอย่างของmyclass
.