Haskell冲突的家庭实例声明

时间:2018-08-24 16:22:43

标签: haskell

我尝试为两种Int类型定义除法函数

class Dnum a b where
    type DivType a b
    _div::a->b-> DivType a b

instance Dnum Int Integer where
    type DivType Int Integer = Integer
    _div a b = div (fromIntegral a)  b 

instance Dnum Int Int where
    type DivType Int Int = Integer
    _div x y = div (fromIntegral x) (fromIntegral y)

instance (Num a) => Dnum a a where
    type DivType a a = a 
    _div x y = div x y 

这是我的主要爱好:

main = do 
        let n = 3::Int
        print $ _div n n  

错误:

Conflicting family instance declarations:
      DivType Int Int = Integer -- Defined at MyLib.hs:67:10
      DivType a a = a -- Defined at MyLib.hs:71:10
   |
67 |     type DivType Int Int = Integer

在我看来,该功能 _div Int Int遇到问题,我不确定为什么会说“冲突的家庭实例”, 但是_div Int Integer完全没有问题。

有人知道如何解决吗?

1 个答案:

答案 0 :(得分:3)

问题在于第67和71行上的类型族实例的实例重叠,因为在第67行上您断言了DivType Int Int = Integer,但是在第71行上您说对于任何Num a,{{1 }},尤其是DivType a a = a,因此尚不清楚如何解析DivType Int Int = Int

相反,DivType Int Int不会重叠,因为DivType Int Integer要求两种类型必须匹配。