所以,我试图为我已经制作的类型编写一个类型类实例,并且我遇到了问题。
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)
突然间我被告知我对+
的定义存在冲突。
为什么这不像函数定义的模式匹配那样工作?
它是否以相同的方式工作,我只是做错了什么?
答案 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
因此,将所有+
模式放在一起。