我正在Haskell中编写一个几何库,它充分利用了类型类和类型检查器来帮助强化几何操作的有效性。但是编译器抱怨我有重叠的实例。下面是一个最小的例子,我用Int
替换了矢量类型以简化代码。
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
class PointSet a where
liesIn :: Int -> a -> Bool
data Line = Line Int Int
class TopVec a where
linearSpan :: a -> Line
instance PointSet Line where
point `liesIn` _ = True
class BoundLinear a where
direction :: a -> Int
instance (BoundLinear bdl) => TopVec bdl where
linearSpan bdline = Line 0 0
instance (BoundLinear bdl) => PointSet bdl where
point `liesIn` bdline = point `liesIn` (linearSpan bdline)
编译器(GHC 6.10.3)抱怨我PointSet Line
的实例重叠,因使用liesIn
而产生。匹配的实例是PointSet Line
和(BoundLinear bdl) => PointSet bdl
。但这没有意义,因为PointSet
的唯一实例应该是Line
和BoundLinear
的任何实例。应该没有冲突,因为Line
不是BoundLinear
的实例。任何人都可以对此有所了解吗?