2012-03-03 10 views
6

मैं कक्षा के उदाहरणों की एक जोड़ी को अनिवार्य रूप से परिभाषित करने की कोशिश कर रहा हूं। यही कारण है:हास्केल "नहीं" टाइप बाधा

class Foo a b | a -> b where 
    foo :: a -> b 

instance (not?)Foo a => Bar a b 
    foo x = ... 

instance Foo a => Bar a b 
    foo x = ... 

पहला उदाहरण आधार कार्रवाई को निर्धारित करता है, और सेकंड रिकर्सिवली foo कहता है। क्या इसे करने का कोई तरीका है? एक अच्छा उदाहरण एक सूची को फ़्लैट करना होगा, जहां पहले मामले में यह पहचान कार्य है और दूसरे में यह कॉन्सट का एक पुनरावर्ती अनुप्रयोग है।

+10

ध्यान दें कि हास्केल में, यह सुनिश्चित करना असंभव है कि दिया गया प्रकार * नहीं * किसी दिए गए प्रकार के वर्ग का उदाहरण नहीं है, क्योंकि कोई और आपके कोड को अपने कुछ कोड के साथ संकलित कर सकता है जो उदाहरण प्रदान करता है। –

उत्तर

5

यहां एक implementation of a flatten function है जो किसी भी स्तर की नेस्टेड सूची के साथ काम करता है। मैं वास्तव में इसका उपयोग करने की अनुशंसा नहीं करता हूं - यहां बस हैकेल में इस तरह कुछ हासिल करने के प्रदर्शन के लिए।

+5

इनकोइन्टेंट इंस्टेंस का उपयोग करना मुसीबत का निमंत्रण है। – augustss

+1

@augustss, बहुत सच है, इसलिए मैंने शीर्ष पर डाला गया अस्वीकरण। मुझे नहीं लगता कि 'इनकोइन्टेंट इंस्टेंस' के बिना 'फ्लैटन' को कार्यान्वित करना संभव है (हालांकि शायद यह एक बहुत अच्छा संकेत है कि इस फ़ंक्शन पर निर्भर प्रोग्राम तैयार करना एक बुरा विचार है)। –

+1

@ is7s: समाधान वहां फ़्लैटेड सूची के प्रकार को प्राप्त नहीं कर सकता है (इसलिए आपको इसे 'फ़्लैटन [[3], [4]] :: [Int]' के रूप में निर्दिष्ट करना होगा। उस टी काम के लिए, आपको आवश्यकता है आपके द्वारा दिए गए तीन एक्सटेंशन। यह संभवतः एक सार्थक ट्रेडऑफ है। –

8

एक बहुत ही सरल कारण के लिए इसे सीधे करने का कोई तरीका नहीं है - उदाहरण चयन केवल "सिर", यानी => के बाद का हिस्सा देखता है। आप संदर्भ में कुछ भी नहीं डालते - => से पहले का हिस्सा - इस बात को प्रभावित कर सकता है कि कौन सा उदाहरण चुना गया है।

साधारण मामलों के लिए, आप अक्सर इस मुद्दे से पूरी तरह से बच सकते हैं, जैसे कि "बेस केस" प्रकारों की सीमित संख्या है। एक आम उदाहरण टाइप-स्तरीय सूचियां होगी, जहां आपके पास Cons और Nil का आधार मामला होगा और यह वह है।

सामान्य स्थिति में, आपको लगता है कि एक प्रकार कुछ शर्त को पूरा किया गया है या नहीं के आधार पर चुनता है "सशर्त परीक्षण" प्रकार वर्ग के कुछ प्रकार आम तौर पर की आवश्यकता होगी, तो एक "सहायक" वर्ग जो लेता है वास्तविक क्रियान्वयन बंद हाथ एक पैरामीटर के रूप में सशर्त परिणाम परिणाम और उदाहरण का चयन करने के लिए इसका उपयोग करता है।

+1

तब आप एक जेनेरिक सूची को क्लास सदस्य वर्ग कैसे लागू करेंगे? – Jonathan

+7

खैर, सबसे ईमानदार जवाब यह है कि मैं नहीं करूँगा। ऐसा करने का कोई तरीका नहीं है कि इसे पॉलिमॉर्फिक इनपुट पर तोड़ दिया जाए और यह मेरी राय में परेशानी को न्यायसंगत साबित करने के लिए पर्याप्त उपयोगी नहीं है। उस ने कहा, फ्लैटनिंग सूचियों के लिए मुझे लगता है कि आप रिकर्सिव बनाम बेस केस के बीच चयन करने के लिए ओवरलैपिंग उदाहरणों पर भरोसा कर सकते हैं। क्या आप यहां 'ओवरलैपिंग इंस्टेंस' का उपयोग कर रहे हैं? आपको शायद इसे एक या दूसरे तरीके की आवश्यकता होगी। –

+3

आप एक जेनेरिक सूची फ़्लैटनिंग फ़ंक्शन क्यों चाहते हैं? यह शायद ही कभी उपयोगी है। – augustss

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