定义数据类型时,无法匹配预期的类型

时间:2018-07-16 10:26:43

标签: haskell

我正在尝试定义自己的包含奇数的数据类型:

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实例吗?

1 个答案:

答案 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构造函数中。