2012-09-13 10 views
5

मैं निम्नलिखित की तरह कुछ है। मैं कैसे सुनिश्चित करने के लिए कि उनके data Pig और data Cow कार्यान्वयन Show के सभी उदाहरणों हैं सब Configuration उदाहरणों के लिए मजबूर करने पता नहीं है।गारंटी है कि प्रकार परिवारों कुछ वर्गों प्राप्त होगा

मैं जानता हूँ कि मैं इसे showPig और showCow तरीकों और बाहर पूरे परिसर show उदाहरण लेखन कर सकता है, लेकिन वास्तव में बातें इस तुलना में अधिक जटिल हैं और काफी दर्द होगा।

एक आसान, सुरुचिपूर्ण गारंटी नहीं है कि प्रकार परिवार उदाहरणों खुद को कुछ वर्गों के उदाहरण हैं रास्ता नहीं है?

+1

यह 'LANGAUGE' लाइन' के कारण विफल नहीं होता है? –

+1

यह पूरी फाइल नहीं है; मैंने इस सवाल के प्रयोजनों के लिए इसे कम किया। जाहिर है कि एक मॉड्यूल घोषणा है, एक पार्सरकॉम्बिनेटर। पर्ससी आयात, और बहुत आगे। – So8res

+2

मुझे लगता है कि मैट का मतलब यह था कि रेखा 'LANGAUGE' कहती है जबकि यह' LANGUAGE' होना चाहिए। –

उत्तर

8

तुम बस Show उदाहरण के लिए मैन्युअल रूप से बाधाओं को निर्दिष्ट करने के StandaloneDeriving उपयोग कर सकते हैं।

{-# LANGUAGE StandaloneDeriving, FlexibleContexts, UndecidableInstances #-} 
deriving instance (Show (Pig c), Show (Cow c)) => Show (Farm c) 

यह अभी भी आप Cow और Pig साथ Configuration उदाहरणों कि Show को लागू नहीं करते, फिर भी, जब तक आप उन्हें show की कोशिश न करें के रूप में कराएंगे।

1

जब से तुम तुम बल करना चाहता था Configuration के सभी उदाहरणों के लिए Pig c और Cow c लागू Show, यह बस, वर्ग के संदर्भ में प्रकार परिवारों विवश इसलिए की तरह करने के लिए है करने के लिए एक और भी आसान तरीका:

{-# LANGUAGE TypeFamilies, FlexibleContexts #-} 

class (Show (Pig c), Show (Cow c)) => Configuration c where 
    data Pig c 
    data Cow c 

data Farm c = Farm { pigs :: [Pig c], 
        cows :: [Cow c] } deriving (Show) 

संपादित करें:

रूप @hammar उसकी टिप्पणी में बताया, पिछले कोड संकलन नहीं होंगे। इसे ठीक करने का एक तरीका है जैसा कि उसने सुझाव दिया था StandaloneDeriving का उपयोग करना है। दूसरा रास्ता यह है:

{-# LANGUAGE TypeFamilies, FlexibleContexts, GADTSyntax #-} 

class (Show (Pig c), Show (Cow c)) => Configuration c where 
    data Pig c 
    data Cow c 

data Farm c where 
    Farm :: Configuration c => { pigs :: [Pig c], 
           cows :: [Cow c] } -> Farm c deriving (Show) 

इन दो दृष्टिकोण आप थोड़ा अलग परिणाम प्राप्त, कि @ Hammar के दृष्टिकोण में एक Configuration बाधा की आवश्यकता होगी अगर आप show कहते हैं, जबकि मेरे दृष्टिकोण कर देगा उपलब्ध कहा बाधा।

+1

यह संकलित नहीं करता है (कम से कम जीएचसी 7.4.1 का उपयोग करके)। हालांकि, 'अयोग्य उदाहरण कॉन्फ़िगरेशन सी => शो (फार्म सी)' का उपयोग करके 'स्टैंडअलोनडिविंग 'दृष्टिकोण के साथ संयोजन को' अनिश्चितता 'की आवश्यकता से बचाता है। – hammar

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