मैं जानता हूँ कि एक ओर जहां GHC में एक TypeSynonymInstances विस्तार है कि वहाँ, मैं पता नहीं कैसे यह "खतरनाक" है और मुझे आश्चर्य है अगर यह प्रतिबंध मनमाना है, एक तरह से Monomorphism प्रतिबंध की तरह, या अगर कोई इसके लिए गहरा कारण हैं।कक्षा उदाहरणों की घोषणा करते समय हास्केल टाइप समानार्थी क्यों अनुमति नहीं देता है?
उत्तर
TypeSynonymInstances
पूरी तरह से सुरक्षित है। के बाद से कुछ भी आंशिक रूप से लागू किया प्रकार समानार्थी जैसी संभावित फैंसी स्वीकृत नहीं है तो यह
type Foo a = ([a], [a])
instance Bar (Foo a)
उदाहरण सिर में प्रकार पर्याय के दाहिने हाथ की ओर पूरा लिखने, यानी के रूप में बिल्कुल वैसा ही प्रभाव पड़ता है
रूप में एक ही हैinstance Bar ([a], [a])
हालांकि, ध्यान दें कि दोनों मामलों FlexibleInstances
की आवश्यकता होती है, क्योंकि वे नेस्ट प्रकार कंस्ट्रक्टर्स के साथ ही बार-बार प्रकार चर होते हैं। सामान्य रूप से, यह अक्सर समानार्थी शब्द का विस्तार करने के बाद मामला होगा।
मैं कारण है कि वे डिफ़ॉल्ट रूप से अनुमति नहीं कर रहे हैं हो सकता है लगता है।
हालांकि, FlexibleInstances
भी एक पूरी तरह से सुरक्षित विस्तार है। सबसे बुरा यह कर सकते हैं एक संकलन समय त्रुटि का कारण है, तो आप इस तरह के
instance Xyzzy String
instance Xyzzy [a]
क्यों FlexibleInstances
डिफ़ॉल्ट रूप से उपलब्ध नहीं है का सवाल है, मैं केवल अनुमान लगा सकते हैं कि यह भाषा को सरल बनाने के रूप में अतिव्यापी उदाहरणों परिभाषित करने की कोशिश है। उदाहरण के सिर के लिए मानक नियम सुनिश्चित करता है एक ही रास्ता उदाहरण परिभाषाओं ओवरलैप कर सकते हैं यह है कि अगर उदाहरण के सिर में टाइप कंस्ट्रक्टर्स समान हैं, जबकि FlexibleInstances
साथ ओवरलैप के लिए जांचना थोड़ा अधिक कठिन है।
मैं यह समझ है, यह एक तरह से monomorphism की तरह है प्रतिबंध-वहाँ कुछ भी नहीं गलत के बारे में यह से छुटकारा पाने के है, लेकिन यह आप व्यवहार आप उम्मीद नहीं कर रहे करने के लिए खुलता है। जैसे ही मोनोमोर्फिज्म प्रतिबंध कुछ भी नुकसान नहीं पहुंचाता है- सभी प्रकार अभी भी वैध हैं-यह भी पूरी तरह से सुरक्षित होना चाहिए: टाइप समानार्थी शब्द पर प्रतिबंध हैं, जो उन्हें सरल नाम शॉर्टनिंग (जैसे) से कुछ भी प्रशंसक करने से रोकते हैं, आप कभी आंशिक रूप से उन्हें लागू नहीं कर सकते हैं, इसलिए हमें टाइप-लेवल लैम्बडा नहीं मिलते हैं), और इसलिए आप उन्हें हमेशा अपनी परिभाषा के दाएं हाथ से बदल सकते हैं। इस प्रकार, चूंकि उन परिभाषाओं के दाएं हाथों को उदाहरण के सिर के रूप में चेक किया जा सकता है (या आगे विस्तार करने के लिए समानार्थी शब्द शामिल हैं), कुछ भी असुरक्षित नहीं होना चाहिए।
दूसरी तरफ, मोनोमोर्फिज्म प्रतिबंध को अक्षम करने के रूप में आप संभावित रूप से अजीब प्रदर्शन विशेषताओं तक खुलते हैं, प्रकार समानार्थी उदाहरणों को सक्षम करने से संभावित रूप से विषम प्रकार की श्रेणी त्रुटियों तक पहुंच जाती है। तो चलो -XTypeSynonymInstances
सक्षम है और एक प्रकार पर्याय के साथ एक उदाहरण लिखने का प्रयास करते हैं:
Prelude> :set -XTypeSynonymInstances
Prelude> instance Num String where (+) = (++)
<interactive>:3:10:
Illegal instance declaration for `Num String'
(All instance types must be of the form (T a1 ... an)
where a1 ... an are *distinct type variables*,
and each type variable appears at most once in the instance head.
Use -XFlexibleInstances if you want to disable this.)
In the instance declaration for `Num String'
String
एक सादे पुराने प्रकार की तरह लग रहा है, तो यह पहली बार में आश्चर्य की बात हो सकती है, लेकिन यह वास्तव में [Char]
है, और इसलिए यह उदाहरण हैस्केल 2010 के सख्त नियमों के अनुसार अमान्य है।फिर
Prelude> instance Eq String where
Prelude> "a" == "b"
<interactive>:8:5:
Overlapping instances for Eq [Char]
arising from a use of `=='
Matching instances:
instance Eq a => Eq [a] -- Defined in `GHC.Classes'
instance Eq String -- Defined at <interactive>:7:10
In the expression: "a" == "b"
In an equation for `it': it = "a" == "b"
, भले ही String
की तरह दिखता है: यदि हम -XFlexibleInstances
पर बारी बदल कर उन नियमों को आराम (जो संयोगवश, implies -XTypeSynonymInstances
), इस उदाहरण अब काम करता है:
Prelude> :set -XFlexibleInstances
Prelude> instance Num String where (+) = (++)
... errors about undefined methods ...
Prelude> "a" + "b"
"ab"
लेकिन चीजें बदसूरत तेजी से हो जाता है एक अलग प्रकार की है, हम पहले से ही [a]
के लिए एक उदाहरण है, और इसलिए यह यह ओवरलैप करती है। (और वास्तव में, यह शायद यही कारण है कि -XFlexibleInstances
पर डिफ़ॉल्ट रूप से नहीं है का हिस्सा है।) और -XOverlappingInstances
चालू करने -XFlexibleInstances
को चालू करने से a much dodgier idea है।
यह अनुमति दी जानी थी, लेकिन शुरुआती के लिए हास्केल कम आश्चर्य से भरा बनाने के लिए प्रयास में यह प्रतिबंध लगाया गया था।
- 1. हास्केल "नहीं" टाइप बाधा
- 2. पैरामीटरेटेड थ्रेडस्टार्ट केवल ऑब्जेक्ट पैरामीटर की अनुमति क्यों देता है?
- 3. हास्केल प्रकार समानार्थी
- 4. टाइपसिंहम इंस्टेंस क्यों नहीं आंशिक रूप से लागू प्रकार समानार्थी उदाहरण उदाहरणों में उपयोग किए जाने की अनुमति देते हैं?
- 5. टाइप क्लास के उदाहरणों पर समानार्थी शब्द का प्रभाव क्या है? जीएचसी में TypeSynonymInstances Pragma क्या करता है?
- 6. इंटरफ़ेस विधियों को लागू करते समय आभासी अनुमति क्यों है?
- 7. पायथन: अंतर्निहित कक्षा उदाहरणों में __dict__ विशेषता क्यों नहीं है
- 8. हास्केल: यह टाइप-चेक क्यों करता है?
- 9. कक्षा के उदाहरणों की गणना?
- 10. नियंत्रण आयात क्यों करता है। अनुप्रयोग इस खराब कोड को चेक टाइप करने की अनुमति देता है?
- 11. क्यों स्ट्रिंग स्ट्रिंग की अनुमति है और कंपाइलर द्वारा int int की अनुमति नहीं है?
- 12. क्यों JSON केवल स्ट्रिंग की कुंजी को अनुमति देता है?
- 13. क्यों संकलक रूपांतरण को संकुचित करने की अनुमति देता है
- 14. ORACLE आदेशों में निरंतर न्यूलाइन वर्णों की अनुमति क्यों नहीं देता है?
- 15. क्या हास्केल प्रकार सिस्टम जादू शामिल होने की परिभाषा के लिए अनुमति देता है?
- 16. पार्सर त्रुटि: '_Default' को यहां अनुमति नहीं है क्योंकि यह कक्षा 'System.Web.UI.Page' और मास्टरटाइप घोषणा
- 17. sqlbulkcopy - DBNull की अनुमति नहीं देता है। Value।?
- 18. स्थिर कॉन्स फ्लोट की अनुमति क्यों नहीं है?
- 19. कुछ यसोड उदाहरणों की कोशिश करते समय त्रुटि संकलित करें
- 20. सी ++ कक्षा आगे की घोषणा की कमी?
- 21. सी ++ आपको सबसे ज्यादा व्युत्पन्न कक्षा में पॉइंटर का अनुरोध करने की अनुमति क्यों नहीं देता है?
- 22. क्यों एक बाहरी इंटरफ़ेस हैशकोड/हैश मैप के बराबर प्रदान करने की अनुमति नहीं देता है?
- 23. क्यों 'टी स्ट्रिंग को बढ़ाता है' की अनुमति है लेकिन चेतावनी देता है?
- 24. जीसीसी प्रकार शून्य (गैर-सूचक) की बाहरी घोषणाओं की अनुमति क्यों देता है?
- 25. एक कक्षा को परिभाषित करने के लिए जो हास्केल में विभिन्न अभिलेखों तक समान पहुंच की अनुमति देता है?
- 26. आगे की घोषणा क्यों आवश्यक है?
- 27. मैक ओएस एक्स टर्मिनल एप्लिकेशन में टाइप करते समय मानक इनपुट क्यों प्रदर्शित नहीं होता है?
- 28. सी # में स्थिर संरचनाओं की अनुमति क्यों नहीं है?
- 29. नेस्टेड फ़ंक्शंस की अनुमति नहीं है लेकिन क्यों नेस्टेड फ़ंक्शन प्रोटोटाइप की अनुमति है? [सी ++]
- 30. हास्केल - डेटा घोषणा