2012-01-31 13 views
5

वेन का उपयोग किए बिना कार्यात्मक निर्भरताओं के लिए कवरेज कंडीशनिंग के आसपास कैसे प्राप्त करें, मैं अक्सर कवरेज स्थिति पर हिट करता हूं। UndecidableInstances के साथ इसे उठाना संभव है, लेकिन मैं आमतौर पर उस एक्सटेंशन से दूर रहने की कोशिश करता हूं।कार्यात्मक निर्भरताओं का उपयोग किए बिना -XUndecidableInstances

{-# Language MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-} 

data Result = Result String 
    deriving (Eq, Show) 

data Arguments a b = Arguments a b 

class Applyable a b | a -> b where 
    apply :: a -> b -> Result 

instance Applyable (Arguments a b) (a -> b -> Result) where 
    (Arguments a b) `apply` f = f a b 

जब मैं परिणाम प्रकार अधिक सामान्य बनाने के लिए, कवरेज स्थिति में विफल रहता है (इसलिए UndecidableInstances आवश्यकता होती है):

{-# Language MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances, UndecidableInstances #-} 

data Result a = Result a 
    deriving (Eq, Show) 

data Arguments a b = Arguments a b 

class Applyable a b c | a -> b c where 
    apply :: a -> b -> Result c 

instance Applyable (Arguments a b) (a -> b -> Result c) c where 
    (Arguments a b) `apply` f = f a b 

मैं

यहाँ कुछ हद तक एक काल्पनिक उदाहरण के लिए, कि UndecidableInstances के बिना काम करता है सोचा कि b और c दोनों a द्वारा निर्धारित हैं, अधिक सामान्य कोड किसी भी समस्या का कारण नहीं बनना चाहिए, इसलिए मेरे प्रश्न:

  1. वहाँ UndecidableInstances पर निर्भर रहे बिना यहाँ UndecidableInstances का उपयोग कर
  2. मैं उपरोक्त परिदृश्य मॉडल कर सकते हैं के साथ किसी भी संभावित समस्याओं कर रहे हैं (शायद प्रकार परिवारों के साथ?)
+7

'UndecidableInstances' से दूर रहने का कोई बड़ा कारण नहीं है। सबसे बुरा यह हो सकता है कि टाइप चेकर लूपिंग शुरू करता है (और आपको इसके बारे में बताता है, मुझे लगता है)। आप कवरेज की स्थिति को और अधिक चालाक बना सकते हैं, लेकिन यह कभी भी वह सब कुछ नहीं करेगा जो आप चाहते हैं क्योंकि यह अनावश्यक है। – augustss

+0

सी द्वारा यहां निर्धारित किया गया है? – Saizan

उत्तर

7

UndecidableInstances से दूर रहने के लिए कोई बड़ा कारण नहीं है । सबसे बुरा यह हो सकता है कि टाइप चेकर लूपिंग शुरू करता है (और आपको इसके बारे में बताता है, मुझे लगता है)। आप कवरेज की स्थिति को और अधिक चालाक बना सकते हैं, लेकिन यह कभी भी वह सब कुछ नहीं करेगा जो आप चाहते हैं क्योंकि यह अनावश्यक है।

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