类型类实例声明中的冲突定义和模式匹配

时间:2017-04-20 12:57:55

标签: haskell typeclass

所以,我试图为我已经制作的类型编写一个类型类实例,并且我遇到了问题。

data PlusMinus a = Plus a | Minus a | Zero
deriving(Eq,Show)

实际上,我们有一个具有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 个答案:

答案 0 :(得分: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

因此,将所有+模式放在一起。