0
所以,我试图为我所做的类型编写一个类型类实例,并且遇到了问题。类型实例声明中冲突的定义和模式匹配
data PlusMinus a = Plus a | Minus a | Zero
deriving(Eq,Show)
Essentialy我们已经得到了有3个不同的数据构造和Num
的实例的类型应该表现不同基于这些不同的构造。
instance (Ord a, Eq a,Num a) => Num (PlusMinus a) where
Plus a + Plus b = Plus (a + b)
Plus a - Plus b
| a > b = Plus (a - b)
| a == b = Zero
| a < b = Minus (b - a)
Plus a * Plus b = Plus (a * b)
abs (Plus a) = Plus (a)
signum (Plus a) = 1
fromInteger a
| a > 0 = Plus (fromInteger a)
| a == 0 = Zero
| a < 0 = Minus (fromInteger . abs $ a)
所以,到这里它工作正常,并且如期望的那样,但是当我添加
Minus a + Minus b = Minus (a + b)
突然有人告诉我,我有矛盾的定义为+
。 为什么不能像函数定义的模式匹配那样工作? 它是否以相同的方式工作,我只是做错了什么?
Err,是否像这样的缩进_exactly_?也就是说,所有的图案应该彼此相邻,例如所有'K + V',然后全部'K - V'等等。 – Zeta
哎呀,我应该修正问题中的缩写,我的真实代码的缩进方式不同。我会尝试改变线条的顺序。谢谢! –
谢谢!这是行订单做到了。如果我将'Minus a + Minus b ...'移动到'Plus a + Plus b ...'的下方,它就可以工作 –