อะไรคือความแตกต่างที่สำคัญระหว่างความหลากหลายของแถวและการพิมพ์ย่อย


20

ฉันได้ยินบ่อยครั้งว่าการผันแปรของแถวเป็นวิธีที่ดีกว่าการพิมพ์ย่อย แต่ฉันมีปัญหาในการค้นหาสิ่งที่เปรียบเทียบพวกเขาในรายละเอียด ฉันสนใจเป็นพิเศษในมุมมองของผู้ใช้ระบบ

ฉันเจอโพสต์บล็อกนี้แล้ว แต่ทำให้ฉันมีคำถามมากกว่าเดิม ตัวอย่างเช่นมันอ้างว่าระบบที่มีการพิมพ์ย่อยจะกำหนดประเภทหนึ่งในขณะที่ระบบที่พิมพ์แถวจะกำหนดอีกประเภทหนึ่ง หมายความว่าหากระบบที่มีการพิมพ์ย่อยกำหนดประเภท "การพิมพ์แถว" โดยระบุว่าเป็นการพิมพ์ผิด

ความแตกต่างที่สำคัญอย่างหนึ่งที่ฉันเห็นคือการพิมพ์แถวทำให้สามารถจัดประเภทอาร์กิวเมนต์ได้ (นั่นคือเขียนฟังก์ชันอาร์กิวเมนต์สองตัวที่เกี่ยวข้องกับตัวเองเฉพาะกับaเขตข้อมูลอาร์กิวเมนต์เท่านั้น แต่ต้องการให้อาร์กิวเมนต์มีเขตข้อมูลเดียวกัน) .

คำตอบ:


10

ชนิดย่อยบอกว่าได้รับการแสดงออกของประเภทหนึ่งที่เราสามารถให้มันยังประเภทอื่น เราบอกว่าอดีตเป็นประเภทย่อยของหลังและความสัมพันธ์ของประเภทย่อยนี้ก่อให้เกิดความสัมพันธ์อื่น ๆ อีกมากมาย ในสัญลักษณ์

Γ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}STS<:TT<: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 สูญเสีย (ประเภท) นี่อาจเป็นสิ่งที่คุณต้องการ: มีประเภททั่วไปที่คุณใส่ใจและทุกสิ่งทุกอย่างเป็นรายละเอียดที่ไม่เกี่ยวข้อง ความลำเอียงของฉันมุ่งไปที่การรักษาข้อมูลประเภทให้ได้มากที่สุดเท่าที่จะทำได้ ข้อเสียของวิธีการของการพิมพ์ย่อยมักจะเป็นหลักฐานโดยโปรแกรมที่พิมพ์ถูกต้อง แต่เพียงเพราะประเภทถูกผลักไปยังประเภท "บน" (ไม่มีข้อมูล) ข้อมูลเช่นบันทึกที่ว่างเปล่า การทำซ้ำ, ตัวแปรหลายตัวแปร (โดยทั่วไป) เก็บรักษาข้อมูลประเภท, การพิมพ์ย่อยจะสูญเสียมันไปโดยเจตนา


ขอบคุณสำหรับการตอบรับอย่างละเอียด! อีกคำถามหนึ่ง: หาก subtyping โครงสร้าง + พาราเมทริก polymorphism subsumes แถวพิมพ์ + parametric polymorphism ทำไมคุณถึงใช้อันหลัง?
Alex R

@AlexR อย่างที่ไบรอันกล่าวถึงในบล็อกโพสต์ของเขาการพิมพ์ย่อยโต้ตอบได้ไม่ดีอย่างมากกับการอนุมานประเภทและแง่มุมอื่น ๆ อีกมากมายเช่นปัญหาด้านการยศาสตร์ที่ฉันพูดถึง นอกจากนี้ยังมีปัญหาการใช้งานและความซับซ้อนทางภาษา เพื่อความเป็นธรรมมีพื้นที่การออกแบบที่กว้างสำหรับทั้ง "ประเภทแถว" และประเภทย่อยดังนั้น "subsumes" จึงเป็นคำสั่งคร่าวๆ
Derek Elkins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.