[संपादित करें: Voilà प्रत्येक पर कुछ शब्द]
एचएम प्रकार के निष्कासन के कई तरीके हैं। मेरा उत्तर कई, कम या ज्यादा सफल, उनमें से कुछ को लागू करने के प्रयासों पर आधारित है। पहले जिस पर मैंने ठोकर खाई वह पैरामीट्रिक बहुरूपता है । इस दिशा में एचएम को विस्तारित करने की कोशिश करने वाले प्रकार सिस्टम एफ की ओर जाते हैं और इसलिए टाइप एनोटेशन की आवश्यकता होती है। इस दिशा में दो उल्लेखनीय एक्सटेंशन जो मेरे सामने आए:
एचएमएफ, यह सभी सिस्टम-एफ प्रकारों के लिए टाइप इंट्रेंस की अनुमति देता है, जिसका अर्थ है कि आपके पास एक प्रकार का "मध्य" में सार्वभौमिक मात्राकरण हो सकता है, उनकी उपस्थिति एचएम पॉलीमॉर्फिक प्रकारों के लिए उच्चतम गुंजाइश पर स्थित नहीं है। कागज स्पष्ट रूप से बताता है कि कोई भी स्पष्ट नियम मौजूद नहीं है कि कितने और कहाँ प्रकार के एनोटेशन की आवश्यकता हो सकती है। साथ ही सिस्टम एफ के प्रकार, शब्द आमतौर पर एक प्रिंसिपल प्रकार नहीं होते हैं।
MLF न केवल एचएम का एक विस्तार है, यह सिस्टम एफ का एक विस्तार भी है जो एचएम के प्रमुख प्रकार की संपत्ति को प्रकारों पर एक प्रकार की बाध्य मात्रा का परिचय देकर पुनः प्राप्त करता है। लेखकों द्वारा एक तुलना की गई है, एमएलएफ एचएमएफ की तुलना में कड़ाई से अधिक शक्तिशाली है और एनोटेशन केवल पॉलिमेटिक रूप से उपयोग किए जाने वाले मापदंडों के लिए आवश्यक हैं।
एचएम को विस्तारित करने का एक और तरीका बाधा डोमेन के परिवर्तन के माध्यम से है।
HM (X) हिंडले-मिलनर एक बाधा डोमेन X पर परिमाणित है। इस दृष्टिकोण में, एचएम एल्गोरिथ्म एक्स के लिए एक डोमेन सॉल्वर को भेजे जाने वाले अवरोध उत्पन्न करता है। सामान्य एचएम के लिए, डोमेन सॉल्वर एकीकरण प्रक्रिया है और डोमेन समाहित करता है। प्रकार और प्रकार चर से निर्माण की शर्तों का सेट।
एक्स के लिए एक और उदाहरण प्रेस्बर्गर अंकगणित की भाषा में व्यक्त किया जा सकता है (जिसमें मामले प्रकार की स्थापना / जाँच निर्णायक है) या पीनो अंकगणित की भाषा में (अब निर्णायक नहीं है)। X सिद्धांतों के एक स्पेक्ट्रम के साथ बदलता रहता है, प्रत्येक की अपनी आवश्यकताओं के साथ राशि और प्रकार के एनोटेशन के स्थानीयकरण की आवश्यकता होती है और उन सभी के लिए नहीं।
हास्केल के प्रकार की कक्षाएं भी प्रकार के विधेय को जोड़कर बाधा डोमेन का एक प्रकार का विस्तार हैं MyClass(MyType)
(जिसका अर्थ है कि टाइप MyType के लिए MyClass का एक उदाहरण मौजूद है)।
प्रकार की कक्षाएं प्रकार की सुरक्षा को संरक्षित करती हैं क्योंकि वे मूल रूप से (लगभग) ऑर्थोगोनल अवधारणाएं हैं जो वे एडहॉक बहुरूपता को लागू करती हैं ।
एक उदाहरण के रूप में, उस val
प्रकार का प्रतीक val :: MyClass a => a
लें जिसके लिए आपके पास उदाहरण हो सकते हैं MyClass A
, MyClass B
आदि। जब आप अपने कोड में उस प्रतीक का उल्लेख करते हैं, तो यह वास्तव में है क्योंकि प्रकार का अनुमान पहले से ही लगाया जाता है कि संकलक वर्ग के किस उदाहरण का उपयोग कर सकता है। इसका मतलब यह है कि जिस प्रकार का val
उपयोग किया जाता है उस संदर्भ पर निर्भर करता है। यही कारण है कि एक भी val
बयान चलाने से एक होता हैambiguous type error
: संकलक संदर्भ के आधार पर किसी भी प्रकार का अनुमान नहीं लगा सकता है।
अधिक उन्नत प्रकार के सिस्टम जैसे GADTs, प्रकार के परिवार, निर्भर प्रकार, सिस्टम (F) like, आदि के लिए, टाइप अब "प्रकार" नहीं हैं, वे जटिल कम्प्यूटेशनल ऑब्जेक्ट बन जाते हैं। उदाहरण के लिए इसका मतलब यह है कि एक ही तरह के नहीं दिखने वाले दो प्रकार अलग-अलग नहीं हैं। तो प्रकार समानता तुच्छ नहीं बन जाती है (बिल्कुल भी)।
आपको वास्तविक जटिलता का एक उदाहरण देने के लिए आइए निर्भर प्रकार की सूची पर विचार करें: सूची में वस्तुओं का प्रकार NList a n
कहां a
है और n
इसकी लंबाई क्या है।
एपेंड फंक्शन टाइप होगा append :: NList a n -> NList a m -> NList a (n + m)
और जिप फंक्शन होगा zip :: NList a n -> NList b n -> NList (a, b) n
।
सोचिए अब हमारे पास मेमना है \a: NList t n, b: NList t m -> zip (append a b) (append b a)
। यहां जिप का पहला तर्क टाइप का NList t (n + m)
और दूसरा टाइप का है NList t (m + n)
।
लगभग समान, लेकिन जब तक कि टाइप चेकर को यह पता न हो कि "+" प्राकृतिक संख्याओं पर आधारित है, तो इसे फ़ंक्शन को अस्वीकार करना होगा क्योंकि (n + m) शब्दशः (m + n) नहीं है। यह अब प्रकार के अनुमान / प्रकार की जाँच के बारे में नहीं है, यह प्रमेय साबित करने के बारे में है।
तरल प्रकार कुछ आश्रित प्रकार की खोज कर रहे हैं। लेकिन जैसा कि मैं इसे समझता हूं, यह वास्तव में निर्भर प्रकार नहीं है, सामान्य एचएम प्रकारों की तरह कुछ और जिन पर स्थैतिक सीमा की गणना करने के लिए अतिरिक्त आक्रमण किया जाता है।
आशा है कि ये आपकी मदद करेगा।