เมื่อคุณพูดถึง Python คำถามนั้นไม่ใช่ทฤษฎีเชิงทฤษฎี ดังนั้นฉันจึงพยายามให้มุมมองที่กว้างขึ้นเกี่ยวกับประเภท ประเภทเป็นสิ่งที่แตกต่างกันสำหรับคนอื่น ฉันได้รวบรวมแนวคิดอย่างน้อย 5 ประเภท (แต่เกี่ยวข้องกัน):
ระบบประเภทเป็นระบบโลจิคัลและตั้งทฤษฎี
ระบบประเภทเชื่อมโยงประเภทกับค่าที่คำนวณได้แต่ละรายการ โดยการตรวจสอบการไหลของค่าเหล่านี้ระบบพิมพ์จะพยายามพิสูจน์หรือตรวจสอบให้แน่ใจว่าไม่มีข้อผิดพลาดประเภทเกิดขึ้น
Type คือการจำแนกประเภทที่ระบุข้อมูลประเภทใดประเภทหนึ่งเช่นมูลค่าจริงจำนวนเต็มหรือบูลีนที่กำหนดค่าที่เป็นไปได้สำหรับประเภทนั้น การดำเนินการที่สามารถทำได้กับค่าของประเภทนั้น ความหมายของข้อมูล และวิธีการเก็บค่าประเภทนั้น
ชนิดข้อมูลนามธรรมอนุญาตให้มีการลบข้อมูลในภาษาระดับสูง ADT นั้นมักจะถูกนำไปใช้เป็นโมดูล: อินเทอร์เฟซของโมดูลประกาศขั้นตอนที่สอดคล้องกับการดำเนินการ ADT กลยุทธ์การซ่อนข้อมูลนี้ช่วยให้การใช้งานโมดูลมีการเปลี่ยนแปลงโดยไม่รบกวนโปรแกรมไคลเอนต์
การประยุกต์ใช้ภาษาการเขียนโปรแกรมใช้ชนิดของค่าเพื่อเลือกหน่วยเก็บข้อมูลที่ต้องการค่าและอัลกอริทึมสำหรับการดำเนินการกับค่า
คำพูดมาจาก Wikipedia แต่ฉันสามารถให้การอ้างอิงที่ดีกว่าหากมีความต้องการเกิดขึ้น
ประเภทที่ 1 เกิดขึ้นจากงานของ Russel แต่วันนี้พวกเขาไม่เพียง แต่ปกป้องจากความขัดแย้ง: ภาษาที่พิมพ์ของทฤษฎีแบบ homotopy เป็นวิธีการใหม่ในการเข้ารหัสคณิตศาสตร์ในภาษาที่เป็นทางการภาษาที่เข้าใจได้และเป็นวิธีใหม่สำหรับมนุษย์ในการทำความเข้าใจรากฐาน ของคณิตศาสตร์ (วิธี "เก่า" กำลังเข้ารหัสโดยใช้ทฤษฎีเซตซึ่งเป็นจริง)
ประเภทที่ 2-5 เกิดขึ้นในการเขียนโปรแกรมจากความต้องการที่แตกต่างกัน: เพื่อหลีกเลี่ยงข้อบกพร่องเพื่อจัดประเภทซอฟต์แวร์ข้อมูลนักออกแบบและโปรแกรมเมอร์ทำงานร่วมกับการออกแบบระบบขนาดใหญ่และการใช้ภาษาโปรแกรมได้อย่างมีประสิทธิภาพตามลำดับ
ระบบประเภทใน C / C ++, Ada, Java, Python ไม่ได้เกิดจากการทำงานของ Russel หรือต้องการหลีกเลี่ยงข้อบกพร่อง พวกเขาเกิดขึ้นจากความต้องการที่จะอธิบายข้อมูลประเภทต่าง ๆ ที่นั่น (เช่น "นามสกุลคือสตริงอักขระและไม่ใช่ตัวเลข"), ออกแบบซอฟต์แวร์แบบแยกส่วนและเลือกการแสดงระดับต่ำสำหรับข้อมูลอย่างเหมาะสม ภาษาเหล่านี้ไม่มีประเภท -1 หรือประเภท 2 Java ช่วยให้มั่นใจในความปลอดภัยจากข้อผิดพลาดไม่ใช่โดยการพิสูจน์ความถูกต้องของโปรแกรมโดยใช้ระบบพิมพ์ แต่ด้วยการออกแบบอย่างระมัดระวังของภาษา (ไม่มีตัวชี้คณิตศาสตร์) และระบบรันไทม์ (เครื่องเสมือนการตรวจสอบไบต์) ระบบพิมพ์ใน Java ไม่ใช่ทั้งระบบตรรกะและทฤษฎีเซต
อย่างไรก็ตามระบบการพิมพ์ในภาษาการเขียนโปรแกรม Agda เป็นตัวแปรที่ทันสมัยของระบบการพิมพ์ของ Russel (ขึ้นอยู่กับการทำงานในภายหลังหรือ Per Martin-Lof และนักคณิตศาสตร์อื่น ๆ ) ประเภทของระบบใน Agda ถูกออกแบบมาเพื่อแสดงคุณสมบัติทางคณิตศาสตร์ของโปรแกรมและการพิสูจน์คุณสมบัติเหล่านั้นมันเป็นระบบตรรกะและทฤษฎีเซต
ที่นี่ไม่มีความแตกต่างสีดำ - ขาว: มีหลายภาษาที่เหมาะสม ตัวอย่างเช่นระบบพิมพ์ของภาษา Haskell มีรากฐานในงานของ Russel สามารถมองได้ว่าเป็นระบบของ Agda ที่เรียบง่าย แต่จากจุดยืนทางคณิตศาสตร์มันไม่สอดคล้องกัน (ขัดแย้งกันเอง) หากมองว่าเป็นระบบตรรกะหรือทฤษฎีเซต
อย่างไรก็ตามในฐานะที่เป็นยานพาหนะเชิงทฤษฎีเพื่อปกป้องโปรแกรม Haskell จากข้อบกพร่องมันทำงานได้ค่อนข้างดี คุณยังสามารถใช้ชนิดเพื่อเข้ารหัสคุณสมบัติบางอย่างและพิสูจน์ได้ แต่ไม่ใช่คุณสมบัติทั้งหมดที่สามารถเข้ารหัสได้และโปรแกรมเมอร์ยังสามารถละเมิดคุณสมบัติที่พิสูจน์แล้วได้หากเขาใช้แฮ็กสกปรกที่ท้อใจ
ประเภทของระบบ Scala ยิ่งกว่าเดิมจากงานของ Russel และภาษาพิสูจน์สมบูรณ์แบบของ Agda แต่ยังคงมีรากฐานในงานของ Russel
สำหรับการพิสูจน์คุณสมบัติของภาษาอุตสาหกรรมที่ระบบประเภทนั้นไม่ได้ออกแบบมานั้นมีหลายวิธีและหลายระบบ
สำหรับแนวทางที่น่าสนใจ แต่แตกต่างกันดูโครงการวิจัย Coq และ Microsoft Boogie Coq อาศัยทฤษฎีประเภทเพื่อสร้างโปรแกรมที่จำเป็นจากโปรแกรม Coq Boogie อาศัยคำอธิบายประกอบของโปรแกรมที่จำเป็นพร้อมคุณสมบัติและการพิสูจน์คุณสมบัติเหล่านั้นด้วยโปรแกรมพิสูจน์ทฤษฎีบท Z3 โดยใช้วิธีการที่แตกต่างอย่างสิ้นเชิงกว่า Coq