2011-02-16 17 views
13

के बारे में कुछ सामान्य प्रश्न मुझे the documentation for -XUndecidableInstances पता है, लेकिन मैंने सोचा कि मैं एक विस्तार के लिए पूछूंगा।अनिश्चितता सुरक्षित कब सुरक्षित है? जीएचसी एक्सटेंशन

मान लीजिए मैं दो बहु-प्राचल typeclasses (-XMultiParamTypeClasses साथ अनुमति दी)

class Foo a b 
class Goo a b 
अब

है, मैं एक पैरामिट्रीकृत डेटा प्रकार

data Bar a b 

जो मैं Foo जब का एक उदाहरण बनाना चाहते है लगता है इसके पैरामीटर में से एक Goo के उदाहरण का हिस्सा है। मुझे यकीन है कि पिछले वाक्य सटीक शब्दावली का उपयोग करता नहीं हूँ, इसलिए यहाँ मैं क्या लिखना चाहते है:

instance (Goo c d) => Foo d (Bar a d) 

मैं UndecidableInstances विस्तार के बिना करने की अनुमति नहीं कर रहा हूँ। क्या मैं सोचने में सही हूं क्योंकि यह उदाहरण c प्रकार का संदर्भ नहीं देता है?

मैं ...

  1. बस एक्सटेंशन सक्षम करना चाहिए? क्या कोई इस बात पर विस्तार कर सकता है कि मुझे किस प्रकार की परेशानी मिल सकती है?
  2. Foo पर एक और पैरामीटर जोड़ें, ताकि अंतिम उदाहरण घोषणा Foo c d (Bar a d) जैसी कुछ हो जाए? इसके साथ एक समस्या यह है कि मेरे पास Foo के अन्य उदाहरण हो सकते हैं जो कभी भी इस तरह के "चौथे प्रकार पैरामीटर" का कोई संदर्भ नहीं देते हैं (यानी मेरे कोड के असंबद्ध हिस्सों में instance Foo A B फॉर्म के उदाहरण हैं), इसलिए ये टूट जाएंगे। मैं अपनी कक्षा को नहीं बल्कि मेरी कक्षा को ठीक कर दूंगा।
  3. पर्याप्त पैरामीटर के साथ एक नई कक्षा FooGoo बनाएँ? मुझे लगता है कि मैं उस मामले में खुद को दोहरा रहा हूं, लेकिन कम से कम मैं असंबंधित वर्गों को तोड़ नहीं पाऊंगा।

क्या किसी के पास ज्ञान का कोई शब्द है?

उत्तर

10

क्या मैं सोचने में सही हूं क्योंकि उदाहरण सी प्रकार का संदर्भ नहीं देता है? संदर्भ में एक दावे के लिए

:

हाँ, अपने कोड (here से) का पालन नहीं करता कोई प्रकार चर सिर की तुलना में जोर में और अधिक घटनाओं है

सामान्य रूप से, आपको तब तक सुरक्षित रहना चाहिए जब तक कि आप अन्य उदाहरण जोड़ते हैं जो एक साथ लूप बनाते हैं। OverlappingInstances की बात आती है, जब आप IncoherentInstances पर जाते हैं तो चीजें केवल बालों वाली (और संकलक-निर्भर) होती हैं।

जो कुछ भी आप पूरा करने की कोशिश कर रहे हैं उसके बारे में अधिक जानने के बिना ध्वनि डिजाइन सलाह देना मुश्किल है, लेकिन जांच करने वाली पहली बात यह है कि क्या आपको वास्तव में, वास्तव में गुओ के पैरामीटर के रूप में सी होना चाहिए। आप यह व्यक्त करने में सक्षम हो सकते हैं कि आप इसे पूरा करना चाहते हैं:

class Goo d where 
    bar :: d c -> Int 
    baz :: Quux c => d c -> Int 
+0

धन्यवाद। यह कुछ हद तक स्पष्टीकरण लाता है। – gspr

+0

+1 'इनकोइन्टेंट इंस्टेंस' को बुराई के रूप में वर्णित करने के लिए +1। –

+2

मुझे लगता है कि 'गुओ सीडी' बाधा 'फू डी (बार विज्ञापन)' उदाहरण को अनुपयोगी बनाती है जब तक कि 'गुओ' में कार्यात्मक निर्भरता 'd ​​-> c' न हो - अन्यथा, संकलक कैसे तय करता है कि 'गो' उदाहरण उपयोग करने के लिए? यदि सभी 'Goo' उदाहरणों में 'c'' प्रकार के चर के रूप में 'c' होता है, तो उस प्रकार पैरामीटर को छोड़ने के लिए @ बारसोप का सुझाव जाने का तरीका है। – mokus

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