【发布时间】:2018-07-16 18:43:49
【问题描述】:
我正在尝试定义我自己的包含 Odds 的数据类型:
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 在左侧,我们不是将 Enum 实例定义为 Odd,而不是 Integer 吗?
【问题讨论】:
-
succ的类型为Enum a => a -> a,因此您定义中x的类型为Odd。x + 2因此是一个类型错误。看起来你想做succ (Odd x) = Odd $ x + 2之类的事情? -
@Lee
(Odd x)确实有效,但为什么呢?正如你所说,x + 2给我一个类型错误。 -
succ实现的参数类型为Odd。succ (Odd x)匹配Odd类型(也称为Odd)的唯一构造函数。现在x的类型为Integer,所以x + 2是有效的。
标签: haskell