ชนิดย่อยบอกว่าได้รับการแสดงออกของประเภทหนึ่งที่เราสามารถให้มันยังประเภทอื่น เราบอกว่าอดีตเป็นประเภทย่อยของหลังและความสัมพันธ์ของประเภทย่อยนี้ก่อให้เกิดความสัมพันธ์อื่น ๆ อีกมากมาย ในสัญลักษณ์
Γ⊢E:SS<:TΓ⊢E:T
สิ่งสำคัญที่นี่ (และเหตุผลที่ฉันตรวจสอบ) คือนิพจน์เดียวกันนั้นมีสองประเภทที่แตกต่างกัน ในภาษา polymorphic parametrically มีนัยประเภท instantiation เราได้ดังต่อไปนี้ความสัมพันธ์ Subtyping:
สำหรับทุกประเภทTหากการสร้างอินสแตนซ์ของชนิดนั้นชัดเจนเช่นใน System F ความสัมพันธ์ของการพิมพ์ย่อยนี้จะไม่ถือ(∀α.τ)<:τ[T/α]T
เราสามารถพูดได้ว่าภาษาที่มีประเภทแถว (โดยปกติ) มีความสัมพันธ์ย่อยของรูปแบบก่อให้เกิดโดยที่ . อย่างไรก็ตามวิธีการนี้ได้รับการจัดการโดยการเปลี่ยนความคิดของความเท่าเทียมกันของประเภท (เช่นการรวม) เพื่อให้เช่นพวกเขารวมกัน ในกรณีนี้ความสัมพันธ์ของชนิดย่อยคือ one{ℓ1:A,ℓ2:B}<:{ℓ2:B,ℓ1:A}{ℓ1:A,ℓ2:B}≅{ℓ2:B,ℓ1:A}S≅T⟺S<:T∧T<:S{ℓ1:A,ℓ2:B}={ℓ2:B,ℓ1:A}T<:T
โดยปกติเมื่อเราพูดถึงภาษาที่มีการพิมพ์ย่อยเราหมายถึงคนที่มีความสัมพันธ์ย่อยที่ไม่เกี่ยวกับประเภทพื้นดินคือประเภทที่ไม่มีตัวแปรอิสระ (ซึ่งแน่นอนสามารถและจะสร้างความสัมพันธ์ย่อยสำหรับประเภทที่ไม่ใช่พื้นดิน) ดังนั้นระบบที่มีความหลากหลายของแถวเหมือนกับรอยของไม่ใช่ภาษาที่มีชนิดย่อยในแง่นี้ถึงแม้ว่ามันจะมีความสัมพันธ์ย่อยที่ไม่น่าสนใจที่มาจากภาษาแบบพาราเมตริกที่มีความหมายโดยนัย ในทางตรงกันข้าม subtyping โครงสร้างระบุชัดเจนไม่ใช่ความสัมพันธ์ subtyping subtyping - ประเภทดิน
ตามประเภทแถวฉันจะหมายถึงการรวมกันที่ไม่สำคัญดังที่อธิบายไว้ข้างต้นหรือเทียบเท่า หากไม่มีสิ่งนี้ประเภทแถวจะมีขนาดเล็กกว่าสิ่งอันดับซ้อนกันเล็กน้อย หมายเหตุประเภทของแถวนั้นไม่ขึ้นอยู่กับตัวแปรหลายตัวแปร ฉันไม่ได้หมายถึงการบอกเป็นนัยถึงตัวแปรแถว จากการโต้แย้งเกี่ยวกับ(≅)ด้านบนการพิมพ์ย่อยของโครงสร้างหมายถึงชนิดของแถว แต่ไม่ใช่ในทางกลับกัน Parametric polymorphism คือ orthogonal (ในแง่ที่คุณสามารถมีหรือไม่มีมันก็มีปฏิสัมพันธ์กันอย่างแน่นอน) กับชนิดของแถวหรือโครงสร้างย่อย ระบบที่มี subtyping + polamorphism แบบย่อยโครงสร้าง subsume row type + parametric polymorphism (สมมติว่ามี "union union") ในแง่ที่ว่าทุกคำในหลังสามารถพิมพ์ด้วยชนิดเดียวกันในอดีต อดีตก็สามารถพิมพ์ด้วยประเภทเพิ่มเติมเช่นกัน โดยใช้ตัวอย่างของไบรอันในระบบที่มีโครงสร้างและ subtyping polymorphism พาราanswer
จะมีประเภทเดียวกับในรุ่นพิมพ์แถว แต่ก็ยังจะมีรุ่น subtyping ของประเภทเช่นกัน
ดังนั้นคุณอาจต้องการเปรียบเทียบประเภทแถว + ตัวแปรความหลากหลายกับประเภทย่อยโครงสร้างโดยไม่ต้องมีตัวแปรความหลากหลาย ประโยชน์ที่สำคัญของอดีต (และบางครั้งอุปสรรค) ก็คือว่ามันจะช่วยให้คุณในการเผยแพร่ข้อมูลทั่วโลก เมื่อได้รับอินสแตนซ์ทุกอย่างที่รวมเป็นหนึ่งกับมันก็จะถูกสร้างอินสแตนซ์เช่นกัน สิ่งนี้อาจกระจายไปตามรูตของแอปพลิเคชันของคุณ การดำเนินการเกี่ยวกับตัวแปรแถวผ่านส่วนใหญ่ของรหัสไม่ใช่เรื่องแปลก วิธีการของประเภทย่อยคือการลืมρ{ c : Number }
ข้อมูล: จากประเภทย่อยไปจนถึงข้อมูลประเภท supertype สูญเสีย (ประเภท) นี่อาจเป็นสิ่งที่คุณต้องการ: มีประเภททั่วไปที่คุณใส่ใจและทุกสิ่งทุกอย่างเป็นรายละเอียดที่ไม่เกี่ยวข้อง ความลำเอียงของฉันมุ่งไปที่การรักษาข้อมูลประเภทให้ได้มากที่สุดเท่าที่จะทำได้ ข้อเสียของวิธีการของการพิมพ์ย่อยมักจะเป็นหลักฐานโดยโปรแกรมที่พิมพ์ถูกต้อง แต่เพียงเพราะประเภทถูกผลักไปยังประเภท "บน" (ไม่มีข้อมูล) ข้อมูลเช่นบันทึกที่ว่างเปล่า การทำซ้ำ, ตัวแปรหลายตัวแปร (โดยทั่วไป) เก็บรักษาข้อมูลประเภท, การพิมพ์ย่อยจะสูญเสียมันไปโดยเจตนา