2013-03-20 7 views
7

मान लीजिए मैं निम्नलिखित कोड है:मैं डेटा के उदाहरण उत्पन्न करने के लिए जीएचसी कैसे प्राप्त कर सकता हूं। संदर्भ में टाइप करने योग्य जीएडीटी के लिए उपयुक्त?

{-# LANGUAGE GADTs, DeriveDataTypeable, StandaloneDeriving #-} 
import Data.Typeable 

class Eq t => OnlyEq t 
class (Eq t, Typeable t) => BothEqAndTypeable t 

data Wrapper a where 
    Wrap :: BothEqAndTypeable a => a -> Wrapper a 

deriving instance Eq (Wrapper a) 
deriving instance Typeable1 Wrapper 

तब, निम्न उदाहरण घोषणा काम करता है, बिनाt पर एक बाधा:

instance OnlyEq (Wrapper t) 

और मैं इसे करने की उम्मीद क्या करता है।


लेकिन निम्नलिखित उदाहरण घोषणा काम नहीं करता:

instance BothEqAndTypeable (Wrapper t) 

GHC के बाद से - - मैं 7.6.1 का उपयोग कर रहा है कि शिकायत:

No instance for (Typeable t) 
    arising from the superclasses of an instance declaration 
Possible fix: 
    add (Typeable t) to the context of the instance declaration 
In the instance declaration for `BothEqAndTypeable (Wrapper t)' 

संदर्भ के लिए Typeable t जोड़ना काम करता है, ज़ाहिर है। लेकिन इसलिए निम्न उदाहरण जोड़ना:

instance Typeable (Wrapper t) where 
    typeOf (Wrap x) = typeOf1 (Wrap x) `mkAppTy` typeOf x 

क्या जीएचसी मेरे लिए यह बाद का उदाहरण लिखने का कोई तरीका है? यदि हां, तो कैसे? यदि नहीं, तो क्यों नहीं?

मुझे उम्मीद थी GHC Wrap निर्माता पर संदर्भ से Typeable बाधा खींचने के लिए, बस के रूप में यह Eq बाधा के साथ किया था सक्षम होगा। मुझे लगता है कि मेरी समस्याएं इस तथ्य को उबालती हैं कि जीएचसी स्पष्ट रूप से deriving instance Typeable (Wrapper t) लिखने की अनुमति नहीं देता है, और मानक (Typeable1 s, Typeable a) => Typeable (s a) उदाहरण Typeable a शब्दकोश खोजने के लिए s a पर 'अंदर देखो' नहीं हो सकता है।

उत्तर

5

मुझे उम्मीद थी GHC यदि यह एक Wrap निर्माता था Wrap निर्माता

पर संदर्भ से Typeable बाधा खींचने में सक्षम हो सकता है, यह इसे से Typeable बाधा खींच सकता है।

लेकिन इसमें Wrap कन्स्ट्रक्टर नहीं है।

अंतर यह है कि Eq उदाहरण मान का उपयोग करता है, इसलिए यह या तो एक Wrap something, जहां Wrap निर्माता लिपटे प्रकार के लिए Eq शब्दकोश उपलब्ध बनाता है, और सब कुछ ठीक है, या यह है, और फिर सब कुछ भी ठीक है , x == y बोतलों का मूल्यांकन।

ध्यान दें कि व्युत्पन्न

instance Eq (Wrapper a) 

करता नहीं प्रकार चर a पर एक Eq बाधा है।

Prelude DerivT> (undefined :: Wrapper (Int -> Int)) == undefined 
*** Exception: Prelude.undefined 
Prelude DerivT> (undefined :: (Int -> Int)) == undefined 

<interactive>:3:29: 
    No instance for (Eq (Int -> Int)) arising from a use of `==' 
    Possible fix: add an instance declaration for (Eq (Int -> Int)) 
    In the expression: (undefined :: Int -> Int) == undefined 
    In an equation for `it': 
     it = (undefined :: Int -> Int) == undefined 

लेकिन Typeable उदाहरण मूल्य का उपयोग नहीं करना होगा, ताकि कोई बाहर bottoming अगर आपूर्ति मूल्य एक Wrap something नहीं है नहीं है।

इस प्रकार व्युत्पन्न instance Typeable1 Wrapper आपूर्ति

instance Typeable t => Typeable (Wrapper t) 

लेकिन अबाधित नहीं

instance Typeable (Wrapper t) 

और उस स्वेच्छापूर्ण उदाहरण GHC द्वारा प्राप्त नहीं किया जा सकता।

इसलिए आप या अबाधित

instance Typeable (Wrapper t) 

खुद के लिए या तो एक विवश

instance Typeable t => BothEqAndTypeable (Wrapper t) 

प्रदान करने के लिए है।

+1

ठीक है, मैं 'अपरिभाषित' के बेहतर बिंदुओं के बारे में भूल रहा हूं क्योंकि मैं आमतौर पर अपने डेटाटाइप में कुछ संग्रहीत करता हूं :-) मुझे लगता है कि मुझे किसी प्रकार की 'न्यूटाइप' जीएडीटी की आवश्यकता है! और एक अतिरिक्त सवाल, यदि मैं कर सकता हूं: अनजान 'टाइप करने योग्य (रैपर टी)' उदाहरण है जिसे मैंने किसी भी तरह से खराब लिखा है, बशर्ते मुझे परवाह नहीं है कि 'टाइपऑफ (त्रुटि "आर्ग" :: रैपर बूल)' बोतलों को बाहर रखा गया है? – yatima2975

+2

ठीक है, यह थोड़ा आश्चर्यजनक उदाहरण है क्योंकि आप इसे 'अपरिभाषित :: रैपर बूल' के साथ अन्य 'टाइप करने योग्य' उदाहरणों के साथ उपयोग नहीं कर सकते हैं। यदि आप इसे सार्वजनिक करते हैं, तो कम से कम इस पर चेतावनी दें। लेकिन मुझे नहीं लगता कि आपको जरूरी रूप से रोकना चाहिए। भविष्य में जीएचसी रिलीज करता है, हालांकि - 7.8 से आगे के मेथिंक, सभी 'टाइप करने योग्य' उदाहरण जीएचसी द्वारा प्रदान किए जाएंगे, और सभी प्रकार के लिए, आईआईआरसी। तो आपको तब ऐसी समस्याओं से निपटने की ज़रूरत नहीं होगी। –

+1

भंडार को देखते हुए, आपको '-XAutoDeriveTypeable' की आवश्यकता होगी। ठंडा! मुझे लगता है कि मैं * सप्ताहांत में बस 7.8.1 क्लोन और क्लोन कर सकता हूं, लेकिन आखिरी बार जब मैंने जीएचसी बनाया था 2002 में (शुरुआती 6.x चक्र?), तो यह थोड़ा डरावना है ... लेकिन फिर से धन्यवाद! – yatima2975

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

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