Haskell中的重叠类型类实例

时间:2015-01-27 01:19:38

标签: haskell compiler-errors typeclass type-safety

我正在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的唯一实例应该是LineBoundLinear的任何实例。应该没有冲突,因为Line不是BoundLinear的实例。任何人都可以对此有所了解吗?

0 个答案:

没有答案