Birbiriyle kesişen geometrik nesneler için bir tür sınıfı tanımlamak istiyorum:
class Intersect a b c | a b -> c where
intersect :: a -> b -> c
-- Language extensions: -XMultiParamTypeClasses, -XFunctionalDependencies
Fikir, farklı tipteki nesneleri işleyebilen genel amaçlı bir kavşak fonksiyonuna sahip olmaktır. Birisi şöyle düşünebilirdi:
instance Intersect Line Plane (Maybe Point) where
...
instance Intersect Plane Plane (Maybe Line) where
...
Ama aynı zamanda kavşağın değişmeli olduğunu beyan etmek istiyorum:
instance (Intersect a b c) => Intersect b a c where
intersect x y = intersect y x
-- Language extensions: -XUndecidableInstances
Sorun değerlendirilmesi her olmasıdır intersect x ybirinci biçiminin bir örneğini tanımlamadan Intersect a b c, atürüdür xve btürüdür y, program sonsuz döngüye girer muhtemelen komutatiflik ilgili özyinelemeli örneği beyan neden olduğu. İdeal olarak intersect Egg Baconböyle bir örnek tanımlanmadı, beni sonsuz bir döngüde tuzak değil çünkü tip-kontrol başarısız olmak istiyorum gibi bir şey istiyorum . Bunu nasıl uygulayabilirim?