2017-04-20 48 views
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) 

突然有人告诉我,我有矛盾的定义为+。 为什么不能像函数定义的模式匹配那样工作? 它是否以相同的方式工作,我只是做错了什么?

+1

Err,是否像这样的缩进_exactly_?也就是说,所有的图案应该彼此相邻,例如所有'K + V',然后全部'K - V'等等。 – Zeta

+0

哎呀,我应该修正问题中的缩写,我的真实代码的缩进方式不同。我会尝试改变线条的顺序。谢谢! –

+0

谢谢!这是行订单做到了。如果我将'Minus a + Minus b ...'移动到'Plus a + Plus b ...'的下方,它就可以工作 –

回答

2

当你定义一个函数f,函数的所有模式必须是彼此相邻:

f 1 'a' = 0 
f 1 'b' = 1 
f k v = 2 

如果在两者之间,你有多个声明添加其他功能的图样:

f 1 'a' = 0 
f 1 'b' = 1 

whoops k = "hello" 

f k v = 2 -- error here 

因此,把你所有的+模式彼此相邻。