मैंने इस बारे में थोड़ा सोचा है। मुख्य मुद्दा यह है कि सामान्य तौर पर, हम नहीं जानते कि बहुरूपता का मूल्य कितना बड़ा है। यदि आपके पास यह जानकारी नहीं है, तो आपको इसे किसी तरह प्राप्त करना होगा। बहुरूपता को दूर करके आपके लिए मोनोमोर्फिसेशन यह जानकारी प्राप्त करता है। बॉक्सिंग को ज्ञात आकार के प्रतिनिधित्व में सब कुछ डालकर आपके लिए यह जानकारी मिलती है।
एक तीसरा विकल्प यह है कि प्रकार में इस जानकारी पर नज़र रखें। मूल रूप से, आप जो कर सकते हैं वह प्रत्येक डेटा आकार के लिए एक अलग तरह का परिचय देना है, और फिर बहुरूप कार्यों को एक विशेष आकार के सभी प्रकारों पर परिभाषित किया जा सकता है। मैं नीचे इस तरह की एक प्रणाली स्केच करूँगा।
KindsType constructorsκA::=n::=|∀a:κ.A|α|A×B|A+B|A→BrefA|Pad(k)|μα:κ.A
यहां, उच्च स्तर का विचार यह है कि एक प्रकार का प्रकार आपको बताता है कि स्मृति में किसी वस्तु को बिछाने के लिए कितने शब्द लगते हैं। किसी भी आकार के लिए, उस विशेष आकार के सभी प्रकारों पर बहुरूपी होना आसान है। चूंकि हर प्रकार के - यहां तक कि बहुरूपी भी - अभी भी एक ज्ञात आकार है, संकलन सी की तुलना में कोई कठिन नहीं है।
दयालु नियम इस अंग्रेजी को गणित में बदल देते हैं, और कुछ इस तरह दिखना चाहिए:
α: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 संरचना प्रकार की तरह)। असंतुष्ट संघ एक ही आकार के दो मान लेते हैं, और फिर एक विभेदक टैग के लिए एक शब्द जोड़ते हैं। फ़ंक्शंस क्लोजर होते हैं, जिन्हें सूचक द्वारा पर्यावरण और कोड के रिकॉर्ड के रूप में सामान्य रूप से दर्शाया जाता है।A×BAB
संदर्भ दिलचस्प हैं - संकेत हमेशा एक शब्द होते हैं, लेकिन वे किसी भी आकार के मूल्यों को इंगित कर सकते हैं। इससे प्रोग्रामर
मुक्केबाजी द्वारा वस्तुओं को मनमाने ढंग से लागू करने की अनुमति देते हैं , लेकिन
उन्हें ऐसा करने की आवश्यकता नहीं होती है। अंत में, एक बार स्पष्ट आकार खेलने के बाद, यह अक्सर एक गद्दी प्रकार पेश करने के लिए उपयोगी होता है, जो अंतरिक्ष का उपयोग करता है लेकिन कुछ भी नहीं करता है। (इसलिए यदि आप एक इंट और एक जोड़ी चींटियों के असंतुष्ट संघ को लेना चाहते हैं, तो आपको पहला इंट पैडिंग जोड़ना होगा, ताकि ऑब्जेक्ट लेआउट एक समान हो।)
पुनरावर्ती प्रकारों में मानक गठन नियम होता है, लेकिन ध्यान दें कि पुनरावर्ती घटनाओं का आकार एक ही होना चाहिए, जिसका अर्थ है कि आपको आमतौर पर किंडरिंग वर्क आउट करने के लिए एक पॉइंटर में चिपकना होगा। उदाहरण के लिए, सूची डेटाटाइप का प्रतिनिधित्व किया जा सकता है
μα:1.ref(Pad(2)+int×α)
तो यह एक खाली सूची मूल्य, या किसी अन्य लिंक की गई सूची के लिए एक इंट और पॉइंटर की एक जोड़ी की ओर इशारा करता है।
इस तरह के सिस्टम के लिए टाइप जाँच भी बहुत कठिन नहीं है; जोशुआ डनफील्ड के साथ मेरे आईसीएफपी पेपर में एल्गोरिथ्म, उच्च रैंक पॉलीमोर्फिज़्म के लिए पूर्ण और आसान बिडायरेक्शनल टंकण इस मामले में लगभग कोई बदलाव नहीं है।