यहां एक और कारक है, जिसमें कुछ लिंक शामिल हैं जो एफ़ोल्टर में शामिल हैं, लेकिन यह स्पष्ट रूप से यहां लायक हो सकता है। आप monomorphism restriction के प्रभाव का सामना कर रहे हैं। जब आप कहते हैं कि
let x = 5
आप एक चर के उच्च-स्तरीय परिभाषा बनाते हैं। एमआर जोर देकर कहते हैं कि ऐसी परिभाषाएं, जब किसी अन्य प्रकार के हस्ताक्षर से अनजान हों, तो अनसुलझे प्रकार चर के लिए उपयुक्त उम्मीदों को चुनकर (उम्मीदपूर्वक) चुनकर एक मोनोमोर्फिक मान के लिए विशिष्ट होना चाहिए। इसके विपरीत, जब आप अनुमानित प्रकार के लिए पूछने के लिए :t
का उपयोग करते हैं, तो ऐसा कोई प्रतिबंध या डिफ़ॉल्ट नहीं लगाया जाता है। तो
> :t 3
3 :: (Num t) => t
क्योंकि 3
वास्तव में ओवरलोड हो गया है: यह किसी भी सांख्यिक प्रकार के आधार पर भर्ती कराया गया है। दोषी नियम Integer
डिफ़ॉल्ट संख्यात्मक प्रकार के रूप में, तो
> let x = 3
> :t x
x :: Integer
चुनें लेकिन अब के एमआर बंद कर देते हैं।
> :set -XNoMonomorphismRestriction
> let y = 3
> :t y
y :: (Num t) => t
एमआर के बिना, परिभाषा बस के रूप में बहुरूपी के रूप में यह हो सकता है, बस के रूप में के रूप में 3
अतिभारित है। बस जाँच रहा हूँ...
> :t y * (2.5 :: Float)
y * (2.5 :: Float) :: Float
> :t y * (3 :: Int)
y * (3 :: Int) :: Int
ध्यान दें कि बहुरूपी y = 3
अलग ढंग से, इन उपयोगों में विशेषज्ञता प्राप्त की जा रही है fromInteger
विधि प्रासंगिक Num
उदाहरण के साथ आपूर्ति के अनुसार। यही है, y
के एक विशेष प्रतिनिधित्व से जुड़ा हुआ नहीं है, बल्कि के प्रतिनिधित्व के निर्माण के लिए एक योजना है। नाइली संकलित, यह धीमी गति के लिए एक नुस्खा है, जो कुछ लोग एमआर के लिए प्रेरणा के रूप में उद्धृत करते हैं।
मैं (स्थानीय रूप से होने का नाटक) इस बारे में बहस पर तटस्थ हूं कि मोनोमोर्फिज्म प्रतिबंध कम या अधिक बुरा है या नहीं। मैं हमेशा शीर्ष-स्तर की परिभाषाओं के लिए प्रकार हस्ताक्षर लिखता हूं, इसलिए मैं जो हासिल करने की कोशिश कर रहा हूं उसके बारे में कोई अस्पष्टता नहीं है और एमआर बिंदु के बगल में है।
जब जानने के लिए कैसे प्रकार प्रणाली काम करता है की कोशिश कर रहा है, यह प्रकार निष्कर्ष के पहलुओं जो
‘ योजना ’, विशेष रूप से उपयोग के मामलों को बहुरूपी परिभाषाओं विशेषज्ञता का पालन अलग करने के लिए वास्तव में उपयोगी है: एक काफी मजबूत मामला बाधा को हल करने के लिए, बैकचेनिंग द्वारा मूल एकीकरण और उदाहरण संकल्प की आवश्यकता होती है; और
‘ लगता योजना ’, प्रकार सामान्यीकरण कोई प्रकार हस्ताक्षर के साथ एक परिभाषा के लिए एक बहुरूपी प्रकार योजना आवंटित करने के लिए: इससे काफी नाजुक है, और अधिक आप प्रकार वर्गों के साथ अतीत बुनियादी Hindley-मिलनर अनुशासन ले जाते हैं,, जीएडीटी के साथ उच्च रैंक बहुरूपता, अजनबी चीजें बन जाती हैं।
यह सीखना अच्छा होता है कि पहला काम कैसे करता है, और यह समझने के लिए कि दूसरा क्यों मुश्किल है। टाइप अनुमान में अजीबता में से अधिकांश दूसरे के साथ जुड़ा हुआ है, और मोनोमोर्फिज्म प्रतिबंध जैसे हेरिस्टिक, अस्पष्टता के चेहरे में उपयोगी डिफ़ॉल्ट व्यवहार देने की कोशिश कर रहा है।
हां, नया शीर्षक पुराना एक से अधिक विशिष्ट/स्पष्ट है! –
मैंने अपने मूल प्रश्न के निचले हिस्से को हटा दिया; वारंट समावेशन के लिए पर्याप्त मूल्य नहीं जोड़ रहा था। –