Я хочу визначити клас типу для геометричних об'єктів, які можна перетинати між собою:
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
не вдалося перевірити тип, тому що жоден такий екземпляр не був визначений, не вловлюйте мене у нескінченному циклі. Як я можу це здійснити?