我正在尝试定义自己的包含奇数的数据类型:
data Odd = Odd Integer deriving (Eq, Show)
instance Enum Odd where
succ x = Odd $ x + 2
pred x = Odd $ x - 2
当我尝试编译它时,我得到:
hello.hs:92:18: error:
• Couldn't match expected type ‘Integer’ with actual type ‘Odd’
• In the second argument of ‘($)’, namely ‘x + 2’
In the expression: Odd $ x + 2
In an equation for ‘succ’: succ x = Odd $ x + 2
|
92 | succ x = Odd $ x + 2
| ^^^^^
Failed, no modu
我不明白为什么haskell期望左手使用Integer
,难道我们不定义名为Odd而不是Integer的Enum实例吗?
答案 0 :(得分:4)
从语法上讲,您要做的是将Integer
添加到Odd
对象。由于Haskell中的加法要求两个操作数具有相同的类型,并且Odd
并不是Num
类型,因此使编译器抱怨这是不可能的。
但是,您可以获得包装在Odd
构造函数中的元素,然后处理该元素。例如:
instance Enum Odd where
succ (Odd x) = Odd (x+2)
pred (Odd x) = Odd (x-2)
因此,我们在这里通过与Integer
进行模式匹配来获取包装在x
构造函数中的Odd
Odd x
,然后我们可以处理该整数{{1 }} 进一步。例如,将其添加两个,然后将其包装在另一个x
构造函数中。