定义自定义数据类型处理如何传递给部分应用的函数

时间:2016-06-11 22:01:17

标签: haskell

我有一个类型Coin

data Coin = Coin Int deriving (Show)

我希望能够用硬币划分Int类型的数量并获得整数结果。由于硬币只能是整数,我决定将硬币类型作为Integral类型类的实例:

instance Integral Coin where
  div x (Coin y) = Coin (div x y)

因此,部分应用的div函数仍然可以采用Coin类型。但是,当我尝试编译时,我得到了

Couldn't match expected type `Int' with actual type `Coin'
In the first argument of `div', namely `x'
In the first argument of `Coin', namely `(div x y)'

不知道我哪里出错了。我想要做的是:

div 100 (Coin 25) -- evaluated to 4

1 个答案:

答案 0 :(得分:1)

div的一般类型是

> :t div
div :: Integral a => a -> a -> a

在您的实例中,您选择aCoin。但是,这会强制两个参数具有相同的类型Coin

如果你想要一个具有异构参数的除法函数,你必须定义自己的自定义函数,并避免使用div

divCoins :: Int -> Coin -> Coin
divCoins x (Coin y) = Coin (div x y)

(我仍然对“按硬币划分整数”感到困惑,反之亦然,对我来说看起来更自然,但我不知道你的目标。)

如果我们想要挑剔,可以通过添加div 100 (Coin 5)实例来Num Coin进行类型检查,以便100可以是Coin类型。不过,我不确定这是不是一个好主意。在不知道Coin的预期用途的情况下,我会避免这种情况。

修改:我忘了Integral需要Num,正如@leftaroundabout指出的那样。