मैं ज्यामितीय वस्तुओं के लिए एक प्रकार के वर्ग को परिभाषित करना चाहता हूं जिन्हें एक साथ प्रतिच्छेद किया जा सकता है:
class Intersect a b c | a b -> c where
intersect :: a -> b -> c
-- Language extensions: -XMultiParamTypeClasses, -XFunctionalDependencies
विचार एक सामान्य-उद्देश्य वाले चौराहे के कार्य हैं जो विभिन्न प्रकारों की वस्तुओं को संभाल सकते हैं। एक ऐसे उदाहरणों की कल्पना कर सकता है
instance Intersect Line Plane (Maybe Point) where
...
instance Intersect Plane Plane (Maybe Line) where
...
लेकिन मैं यह भी घोषित करना चाहता हूं कि चौराहा सराहनीय है:
instance (Intersect a b c) => Intersect b a c where
intersect x y = intersect y x
-- Language extensions: -XUndecidableInstances
समस्या यह है कि जब भी मैं intersect x yफॉर्म के एक उदाहरण को परिभाषित किए बिना पहली बार मूल्यांकन करता हूं Intersect a b c, aतो इसका प्रकार कहां है xऔर bकिस प्रकार का है y, प्रोग्राम अनंत लूप में जाता है , संभवतः कम्यूटेटिविटी के बारे में पुनरावर्ती उदाहरण घोषणा के कारण होता है। आदर्श रूप से मैं चाहता हूं कि कुछ ऐसा intersect Egg Baconहो जो टाइप-चेक करने में विफल हो क्योंकि इस तरह की कोई भी घटना परिभाषित नहीं थी, न कि मुझे अनंत लूप में फंसाने की। मैं इसे कैसे लागू कर सकता हूं?