वेन का उपयोग किए बिना कार्यात्मक निर्भरताओं के लिए कवरेज कंडीशनिंग के आसपास कैसे प्राप्त करें, मैं अक्सर कवरेज स्थिति पर हिट करता हूं। 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
द्वारा निर्धारित हैं, अधिक सामान्य कोड किसी भी समस्या का कारण नहीं बनना चाहिए, इसलिए मेरे प्रश्न:
- वहाँ
UndecidableInstances
पर निर्भर रहे बिना यहाँUndecidableInstances
का उपयोग कर - मैं उपरोक्त परिदृश्य मॉडल कर सकते हैं के साथ किसी भी संभावित समस्याओं कर रहे हैं (शायद प्रकार परिवारों के साथ?)
'UndecidableInstances' से दूर रहने का कोई बड़ा कारण नहीं है। सबसे बुरा यह हो सकता है कि टाइप चेकर लूपिंग शुरू करता है (और आपको इसके बारे में बताता है, मुझे लगता है)। आप कवरेज की स्थिति को और अधिक चालाक बना सकते हैं, लेकिन यह कभी भी वह सब कुछ नहीं करेगा जो आप चाहते हैं क्योंकि यह अनावश्यक है। – augustss
सी द्वारा यहां निर्धारित किया गया है? – Saizan