Quiero definir una clase de tipo para objetos geométricos que se puedan intersectar juntos:
class Intersect a b c | a b -> c where
intersect :: a -> b -> c
-- Language extensions: -XMultiParamTypeClasses, -XFunctionalDependencies
La idea es tener funciones de intersección de propósito general que puedan manejar objetos de diferentes tipos. Uno podría imaginarse instancias como
instance Intersect Line Plane (Maybe Point) where
...
instance Intersect Plane Plane (Maybe Line) where
...
Pero también quiero declarar que la intersección es conmutativa:
instance (Intersect a b c) => Intersect b a c where
intersect x y = intersect y x
-- Language extensions: -XUndecidableInstances
El problema es que cada vez que evalúo intersect x y
sin definir primero una instancia de la forma Intersect a b c
, donde a
es el tipo de x
y b
es el tipo de y
, el programa entra en un bucle infinito , presumiblemente causado por una declaración de instancia recursiva sobre la conmutatividad. Idealmente, quiero que algo como intersect Egg Bacon
no verificar el tipo porque no se definió tal instancia, no atraparme en un bucle infinito. ¿Cómo puedo implementar esto?