मुझे लगता है कि मैं जो चाहता हूं वह टेम्पलेट हास्केल के बिना असंभव है लेकिन मैं वैसे भी पूछूंगा।सभी प्रकार के पारिवारिक उदाहरणों पर टाइप बाधाएं
मैं Data.Set
और Data.IntSet
तरह प्रकार के लिए एक इंटरफेस है:
type family Elem s :: *
class SetLike s where
insert :: Elem s -> s -> s
member :: Elem s -> s -> Bool
...
type instance Elem (Set a) = a
instance Ord a => SetLike (Set a) where
...
और मैं एक प्रकार परिवार जो इष्टतम सेट कार्यान्वयन चुनता है:
type family EfficientSet elem :: *
type instance EfficientSet Int = IntSet
type instance EfficientSet String = Set String -- or another implementation
कोई गारंटी नहीं है कि EfficientSet
उदाहरणों एक रास्ता है हमेशा SetLike
और Elem (EfficientSet a)
a
होगा?
इस गारंटी सभी समारोह हस्ताक्षर इस तरह होगा बिना:
type LocationSet = EfficientSet Location
f :: (SetLike LocationSet, Elem LocationSet ~ Location) => ...
हर बार SetLike LocationSet
कुछ हद तक संतोषजनक है लिखने के लिए, लेकिन Elem LocationSet ~ Location
, केवल कठिन कोड समझ में आता है मेरे लिए के रूप में।
सच? एक 'प्रकार' समानार्थी घोषणा न केवल एक प्रकार का समानार्थी परिभाषित कर सकती है, लेकिन एक प्रकार की बाधा समानार्थी? दिलचस्प। क्या यह अंतर्निहित पैरामीटर प्रकार की बाधाओं के साथ भी काम करता है? –
@ जेफबर्जेस हाँ: http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/constraint-kind.html –