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 y
birinci biçiminin bir örneğini tanımlamadan Intersect a b c
, a
türüdür x
ve b
türüdür y
, program sonsuz döngüye girer muhtemelen komutatiflik ilgili özyinelemeli örneği beyan neden olduğu. İdeal olarak intersect Egg Bacon
bö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?