ฉันคิดเล็กน้อยเกี่ยวกับเรื่องนี้ ปัญหาหลักคือโดยทั่วไปแล้วเราไม่รู้ว่าค่าของประเภท polymorphic นั้นใหญ่เพียงใด หากคุณไม่มีข้อมูลนี้คุณจะต้องได้รับข้อมูลอย่างใด Monomorphisation ได้รับข้อมูลนี้จากคุณโดยผู้เชี่ยวชาญด้าน polymorphism Boxing ได้รับข้อมูลนี้มาให้คุณโดยใส่ทุกอย่างลงไปในขนาดที่เป็นที่รู้จัก
ทางเลือกที่สามคือการติดตามข้อมูลนี้ในรูปแบบต่างๆ โดยทั่วไปสิ่งที่คุณสามารถทำได้คือแนะนำชนิดที่แตกต่างกันสำหรับแต่ละขนาดข้อมูลจากนั้นฟังก์ชัน polymorphic สามารถกำหนดได้ในทุกประเภทของขนาดที่เฉพาะเจาะจง ฉันจะร่างระบบดังกล่าวด้านล่าง
KindsType constructorsκA::=n::=|∀a:κ.A|α|A×B|A+B|A→BrefA|Pad(k)|μα:κ.A
ที่นี่ความคิดระดับสูงคือประเภทของประเภทจะบอกคุณว่าต้องใช้หลายคำในการจัดเรียงวัตถุในหน่วยความจำ สำหรับขนาดที่กำหนดใด ๆ มันเป็นเรื่องง่ายที่จะเป็น polymorphic ในทุกประเภทของขนาดนั้น เนื่องจากทุกประเภท - แม้แต่ polymorphic - ยังมีขนาดที่รู้จักการรวบรวมจึงไม่ยากสำหรับ C
กฎการแบ่งให้ภาษาอังกฤษเป็นคณิตศาสตร์และควรมีลักษณะดังนี้:
α:n∈ΓΓ⊢α:nΓ,α:n⊢A:mΓ⊢∀α:n.A:m
Γ⊢A:nΓ⊢B:mΓ⊢A×B:n+mΓ⊢A:nΓ⊢B:nΓ⊢A+B:n+1
Γ⊢A:mΓ⊢B:nΓ⊢A→B:1Γ⊢A:nΓ⊢refA:1
Γ⊢Pad(k):kΓ,α:n⊢A:nΓ⊢μα:n.A:n
ดังนั้นปริมาณทั้งหมดจะต้องให้ชนิดที่คุณมีมากกว่า ในทำนองเดียวกันการจับคู่เป็นประเภทคู่ที่ไม่มีกล่องซึ่งเพิ่งวางถัดจากในหน่วยความจำ (เช่นประเภท C struct) การแยกออกจากกันมีสองค่าที่มีขนาดเท่ากัน ฟังก์ชั่นคือการปิดแสดงตามปกติโดยตัวชี้ไปยังบันทึกของสภาพแวดล้อมและรหัสA×BAB
การอ้างอิงมีความน่าสนใจ - พอยน์เตอร์เป็นหนึ่งคำเสมอ แต่สามารถชี้ไปที่ค่าของขนาดใดก็ได้ สิ่งนี้ช่วยให้โปรแกรมเมอร์ใช้
ความหลากหลายในวัตถุโดยพลการมวย แต่ไม่ต้องการ
ให้พวกเขาทำเช่นนั้น ในที่สุดเมื่อขนาดที่ชัดเจนกำลังเล่นอยู่ก็มักจะมีประโยชน์ในการแนะนำประเภทการขยายซึ่งใช้พื้นที่ แต่ไม่ได้ทำอะไรเลย (ดังนั้นถ้าคุณต้องการใช้การรวมกันของ int และคู่ของ ints คุณจะต้องเพิ่มการเติม int แรกเพื่อให้เค้าโครงของวัตถุมีความเหมือนกัน)
ประเภทการเรียกซ้ำมีกฎการสร้างมาตรฐาน แต่โปรดทราบว่าสิ่งที่เกิดขึ้นแบบเรียกซ้ำต้องมีขนาดเท่ากันซึ่งหมายความว่าคุณมักจะต้องติดมันไว้ในตัวชี้เพื่อให้การทำงานเป็นไปอย่างราบรื่น เช่นประเภทข้อมูลรายการสามารถแสดงเป็น
μα:1.ref(Pad(2)+int×α)
ดังนั้นสิ่งนี้ชี้ไปที่ค่ารายการว่างหรือคู่ของ int และตัวชี้ไปยังรายการที่เชื่อมโยงอื่น
การตรวจสอบประเภทของระบบเช่นนี้ก็ไม่ยากเช่นกัน อัลกอริทึมในกระดาษ ICFP ของฉันกับ Joshua Dunfield การตรวจสอบประเภทการพิมพ์สองทิศทางที่สมบูรณ์และใช้งานง่ายสำหรับ Polymorphism อันดับสูงใช้กับกรณีนี้โดยแทบไม่มีการเปลี่ยนแปลง