2012-01-16 10 views
8

मैं एक प्रकार वर्ग Truthy जो एक विधि true एक Bool मूल्य के प्रकार वर्ग का एक उदाहरण परिवर्तित होता है परिभाषित करने के लिए किया है।किसी अन्य प्रकार के वर्ग में सभी प्रकार के लिए एक उदाहरण कैसे लिखें?

मेरे प्रकार वर्ग घोषणा:

class Truthy a where 
    true :: a -> Bool 

इसके बाद, मैं इस सूची और संख्यात्मक प्रकार सहित विभिन्न प्रकार के लिए इस वर्ग के उदाहरणों को परिभाषित करने के लिए है। मैं सूचियों और Int s के लिए यह किया है, लेकिन वहाँ एक बार में सभी सांख्यिक प्रकार के लिए यह करने के लिए एक तरीका है?

मेरी इंट घोषणा के आधार पर:

instance Truthy Int where 
    true = (/=) 0 

मैं प्रकार वर्ग बाधा जोड़ने की कोशिश की है, लेकिन यह काम नहीं करता है:

instance (Num a) => (Truthy a) where 
    true = (/=) 0::a 

अगर वहाँ को यह समान करने के लिए एक रास्ता है कि मैं क्या ध्यान में था, या मुझे इसे प्रत्येक संख्यात्मक प्रकार के लिए अलग से परिभाषित करना चाहिए?

+0

"या मैं सिर्फ अलग संख्यात्मक प्रकार के लिए यह परिभाषित करना चाहिए?" - एक शब्द में ** हाँ **। प्रकार वर्गों का डिज़ाइन लक्ष्य प्रति-प्रकार के आधार पर ओवरलोडिंग की अनुमति देना है। एक्सटेंशन के साथ "ओवररीचिंग" उदाहरण परिभाषित करना संभव हो सकता है लेकिन वे आम तौर पर एक डिज़ाइन दोष होते हैं। –

+0

संभावित डुप्लिकेट [टाइप क्लास के सभी उदाहरणों को घोषित करें मूल वर्ग घोषणाओं को संशोधित किए बिना किसी अन्य टाइपक्लास में हैं] (http: // stackoverflow।कॉम/प्रश्न/8461029/घोषणा-सब-इंस्टेंस-ऑफ-ए-टाइपक्लास-इन-इन-टाइप-क्लास-बिना-संशोधित) –

उत्तर

10

यह होमवर्क के लिए मदद नहीं कर सकता है, लेकिन आप वास्तव में इस तरह की एक घोषणा लिख ​​सकते हैं। ऐसा करने के लिए आपको बस -XFlexibleInstances सक्षम करना होगा। GHC में कम से कम, आप अपनी फ़ाइल के शीर्ष पर एक pragma रख कर ऐसा कर सकते हैं:

{-# LANGUAGE FlexibleInstances #-} 

आप त्रुटि संदेश मिल को बारीकी से देखें, तो यह "की तरह उपयोग -XFlexibleInstances कुछ कहा आप करना चाहते हैं इसे अक्षम करें। "

इस विशेष मामले में, आप भी UndecideableInstances और OverlappingInstances सक्षम करने की आवश्यकता होगी:

{-# LANGUAGE FlexibleInstances, UndecideableInstances, OverlappingInstances #-} 

आप FlexibleInstances जरूरत है क्योंकि मानक हास्केल किसी भी रूप जहां प्रकार चर सिर में एक बार से अधिक दिखाई देता है में उदाहरणों की अनुमति नहीं है । यह पूरी तरह से ठीक है - मैं यह सबसे आम एक्सटेंशन में से एक है (this question के अनुसार)।

आप UndecideableInstances जरूरत है क्योंकि अपने उदाहरण घोषणा संभावित हमेशा के पाश करने के लिए प्रकार चेकर कारण बन सकता है। मैं UndecideableInstances का उपयोग कर सीमित यह कितनी गहराई से जब उदाहरण कम करने की कोशिश की जाँच करेगा द्वारा इस रोकता है लगता है। यह आमतौर पर है - इस मामले में शामिल हैं - ठीक है, लेकिन सैद्धांतिक रूप से एक विशेष कार्यक्रम प्रकार चेकों कार्यान्वयन निर्भर गुजरता है कि क्या कर सकता है। फिर भी, यह आपके मामले में काम करना चाहिए।

जैसा कि हैमर ने बताया है, आपको OverlappingInstances को सक्षम करने की आवश्यकता है क्योंकि उदाहरण के "संदर्भ" ने को अनदेखा किया है, यह जांचते समय कि वे ओवरलैप करते हैं या नहीं। इस मामले में संदर्भ Num a बिट है। तो उदाहरण - यह ओवरलैप करने के लिए जांचने के लिए - instance Truthy a... के रूप में पढ़ा जाता है और सब कुछ के साथ ओवरलैप करता है। OverlappingInstances सक्षम के साथ, आपको बस एक उदाहरण होना चाहिए जो काम करने के लिए सबसे विशिष्ट है।

+0

मैंने देखा कि त्रुटि लॉग में। संकलन के लिए मुझे कुछ अतिरिक्त सक्षम करने की आवश्यकता क्यों है, या लीस पर जहां मैं इसे पढ़ सकता हूं, इस बारे में स्पष्टीकरण प्राप्त करना बहुत अच्छा होगा। साथ ही, क्या मैं ऐसा करने का एकमात्र तरीका हूं? – penelope

+0

असल में, हास्केल 98 रिपोर्ट ने निर्दिष्ट किया कि कक्षा घोषणाएं "सरल" होनी चाहिए। तो * मानक * हास्केल उस शैली की अनुमति नहीं देता है जिसे आपने उपयोग करने का प्रयास किया था (जब तक कि यह 2010 में नहीं बदला गया हो?)। हालांकि, आपके द्वारा लिखे गए कोड वास्तव में उचित और कार्यान्वित हैं, इसलिए यह जीएचसी द्वारा समर्थित है; आपको प्रज्ञा की आवश्यकता है कि यह मानक में नहीं है। –

+0

संभवतः आप जितनी अधिक जानकारी चाहते हैं, इसके लिए आप दस्तावेज़ों [यहां] (http://www.haskell.org/ghc/docs/7.0.1/html/users_guide/type-class-extensions.html में इसके बारे में पढ़ सकते हैं # सुपरक्लास-नियम) और [यहां] (http://www.haskell.org/ghc/docs/7.0.1/html/users_guide/other-type-extensions.html#flexible-contexts)। –

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

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