मैं ज्यामितीय वस्तुओं के लिए एक प्रकार के वर्ग को परिभाषित करना चाहता हूं जिन्हें एक साथ प्रतिच्छेद किया जा सकता है:
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
हो जो टाइप-चेक करने में विफल हो क्योंकि इस तरह की कोई भी घटना परिभाषित नहीं थी, न कि मुझे अनंत लूप में फंसाने की। मैं इसे कैसे लागू कर सकता हूं?