प्रारंभ करने के लिए, एक संदर्भ में एक "कठोर" प्रकार चर का अर्थ उस संदर्भ के बाहर एक क्वांटिफायर द्वारा बाध्य एक प्रकार चर है, जो इस प्रकार अन्य प्रकार चर के साथ एकीकृत नहीं किया जा सकता है।
यह एक लैम्ब्डा द्वारा बाध्य चर जैसे काम करता है: "बाहर" से लैम्बडा (\x -> ...)
को देखते हुए, आप इसे जो भी मूल्य पसंद करते हैं, उसे लागू कर सकते हैं; लेकिन अंदर पर, आप बस यह तय नहीं कर सकते कि x
का मान कुछ विशेष मूल्य होना चाहिए। लैम्ब्डा के अंदर x
के लिए एक मूल्य चुनना बहुत मूर्खतापूर्ण लगता है, लेकिन यह "ब्लै ब्लाह, कठोर प्रकार चर, ब्ला ब्लाह" से मेल नहीं खा सकता है।
ध्यान दें कि, स्पष्ट forall
क्वांटिफ़ायर का उपयोग किए बिना, किसी भी शीर्ष-स्तरीय प्रकार हस्ताक्षर में प्रत्येक प्रकार के चर के लिए forall
निहित है।
बेशक, यह आपको वह त्रुटि नहीं है जो आपको मिल रही है। क्या "एस्केड टाइप वैरिएबल" का अर्थ भी सिल्लियर है - यह लैम्ब्डा (\x -> ...)
होने और के बाहर लैम्बडा के स्वतंत्र मानों का उपयोग करने की कोशिश कर रहा है, स्वतंत्र रूप से इसे तर्क देने के लिए। नहीं, लैम्बडा को किसी चीज़ पर लागू नहीं करना और परिणाम मूल्य का उपयोग करना - मेरा मतलब है कि वास्तव में वैरिएबल स्वयं का उपयोग करके उस क्षेत्र के बाहर है जहां इसे परिभाषित किया गया है।
कारणों के साथ ऐसा हो सकता है (लैम्ब्डा के साथ उदाहरण के रूप में स्पष्ट रूप से बेतुका प्रतीत होता है) क्योंकि वहां "प्रकार चर" के दो विचार हैं: एकीकरण के दौरान, आपके पास "चर" अनिश्चित प्रकार का प्रतिनिधित्व करते हैं, जिसे फिर टाइप अनुमान के माध्यम से अन्य ऐसे चर के साथ पहचाना जाता है। दूसरी तरफ, आपके ऊपर वर्णित मात्राबद्ध प्रकार चर हैं जिन्हें विशेष रूप से संभावित प्रकारों के रूप में पहचाना जाता है।
लैम्ब्डा अभिव्यक्ति (\x -> x)
के प्रकार पर विचार करें। पूरी तरह से अनिश्चित प्रकार a
से शुरू करते हुए, हम देखते हैं कि यह एक तर्क लेता है और a -> b
तक संकीर्ण करता है, फिर हम देखते हैं कि इसे इसके तर्क के समान कुछ प्रकार वापस करना होगा, इसलिए हम इसे a -> a
पर संकीर्ण करते हैं। लेकिन अब यह किसी भी प्रकार a
के लिए काम करता है जो आप चाहते हैं, इसलिए हम इसे क्वांटिफायर (forall a. a -> a)
देते हैं।
तो, एक भाग निकले प्रकार चर होता है आप एक प्रकार एक परिमाणक कि GHC infers कि परिमाणक के दायरे बाहर एक अनिर्धारित प्रकार के साथ एकीकृत किया जाना चाहिए से बंधे है जब।
तो स्पष्ट रूप से मैं वास्तव में शब्द "स्कोलम प्रकार चर" को समझाता हूं, हे। जैसा कि टिप्पणियों में उल्लिखित है, हमारे मामले में यह अनिवार्य रूप से "कठोर प्रकार चर" के पर्याय का है, इसलिए उपर्युक्त अभी भी विचार बताता है।
मैं पूरी तरह यकीन है कि जहाँ शब्द से उत्पन्न नहीं कर रहा हूँ, लेकिन मैं इसे Skolem normal form और सार्वभौमिक के मामले में अस्तित्व मात्रा का प्रतिनिधित्व शामिल है, के रूप में GHC में किया जाता है लगता है कि होगा। एक स्कोलम (या कठोर) प्रकार चर एक है, कुछ गुंजाइश के भीतर, किसी कारण के लिए एक अज्ञात-लेकिन-विशिष्ट प्रकार है - एक विद्युतीय डेटा प्रकार, & सी से आने वाले पॉलिमॉर्फिक प्रकार का हिस्सा होना।
http://hackage.haskell.org/trac/ghc/ticket/7194? –
हाँ, मैंने देखा कि, लेकिन वह टिकट स्कॉलम के बारे में ज्यादा स्पष्टीकरण नहीं देता है। –
मैं अपने कोड को ठीक करने के तरीके के बजाय, क्या स्कॉल्स हैं और उनके कारण क्या है इसका स्पष्टीकरण ढूंढ रहा हूं। मैंने पहले से ही अपना कोड तय कर लिया है, लेकिन मुझे सच में यकीन नहीं है कि मैंने स्कॉल्स को क्यों हटा दिया .... –