我尝试为两种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
完全没有问题。
有人知道如何解决吗?
答案 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
要求两种类型必须匹配。