2012-10-29 14 views
25

मैं जानता हूँ कि एक ओर जहां GHC में एक TypeSynonymInstances विस्तार है कि वहाँ, मैं पता नहीं कैसे यह "खतरनाक" है और मुझे आश्चर्य है अगर यह प्रतिबंध मनमाना है, एक तरह से Monomorphism प्रतिबंध की तरह, या अगर कोई इसके लिए गहरा कारण हैं।कक्षा उदाहरणों की घोषणा करते समय हास्केल टाइप समानार्थी क्यों अनुमति नहीं देता है?

उत्तर

22

TypeSynonymInstances पूरी तरह से सुरक्षित है। के बाद से कुछ भी आंशिक रूप से लागू किया प्रकार समानार्थी जैसी संभावित फैंसी स्वीकृत नहीं है तो यह

type Foo a = ([a], [a]) 
instance Bar (Foo a) 

उदाहरण सिर में प्रकार पर्याय के दाहिने हाथ की ओर पूरा लिखने, यानी के रूप में बिल्कुल वैसा ही प्रभाव पड़ता है

रूप में एक ही है
instance Bar ([a], [a]) 

हालांकि, ध्यान दें कि दोनों मामलों FlexibleInstances की आवश्यकता होती है, क्योंकि वे नेस्ट प्रकार कंस्ट्रक्टर्स के साथ ही बार-बार प्रकार चर होते हैं। सामान्य रूप से, यह अक्सर समानार्थी शब्द का विस्तार करने के बाद मामला होगा।

मैं कारण है कि वे डिफ़ॉल्ट रूप से अनुमति नहीं कर रहे हैं हो सकता है लगता है।

हालांकि, FlexibleInstances भी एक पूरी तरह से सुरक्षित विस्तार है। सबसे बुरा यह कर सकते हैं एक संकलन समय त्रुटि का कारण है, तो आप इस तरह के

instance Xyzzy String 
instance Xyzzy [a] 

क्यों FlexibleInstances डिफ़ॉल्ट रूप से उपलब्ध नहीं है का सवाल है, मैं केवल अनुमान लगा सकते हैं कि यह भाषा को सरल बनाने के रूप में अतिव्यापी उदाहरणों परिभाषित करने की कोशिश है। उदाहरण के सिर के लिए मानक नियम सुनिश्चित करता है एक ही रास्ता उदाहरण परिभाषाओं ओवरलैप कर सकते हैं यह है कि अगर उदाहरण के सिर में टाइप कंस्ट्रक्टर्स समान हैं, जबकि FlexibleInstances साथ ओवरलैप के लिए जांचना थोड़ा अधिक कठिन है।

14

मैं यह समझ है, यह एक तरह से 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 है।

5

यह अनुमति दी जानी थी, लेकिन शुरुआती के लिए हास्केल कम आश्चर्य से भरा बनाने के लिए प्रयास में यह प्रतिबंध लगाया गया था।

संबंधित मुद्दे

 संबंधित मुद्दे