Voglio definire una classe di tipi per oggetti geometrici che possono essere intersecati insieme:
class Intersect a b c | a b -> c where
intersect :: a -> b -> c
-- Language extensions: -XMultiParamTypeClasses, -XFunctionalDependencies
L'idea è quella di disporre di funzioni di intersezione generiche in grado di gestire oggetti di diverso tipo. Si potrebbero immaginare casi come
instance Intersect Line Plane (Maybe Point) where
...
instance Intersect Plane Plane (Maybe Line) where
...
Ma voglio anche dichiarare che l'intersezione è commutativa:
instance (Intersect a b c) => Intersect b a c where
intersect x y = intersect y x
-- Language extensions: -XUndecidableInstances
Il problema è che ogni volta che valuto intersect x y
senza prima definire un'istanza del modulo Intersect a b c
, dove a
è il tipo x
e b
il tipo di y
, il programma passa in un ciclo infinito , presumibilmente causato dalla dichiarazione ricorsiva dell'istanza sulla commutatività. Idealmente, vorrei che qualcosa del genere intersect Egg Bacon
non riuscisse a controllare il tipo perché non era stata definita un'istanza del genere, non mi intercettava in un ciclo infinito. Come posso implementarlo?