我有一个类型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
答案 0 :(得分:1)
div
的一般类型是
> :t div
div :: Integral a => a -> a -> a
在您的实例中,您选择a
为Coin
。但是,这会强制两个参数具有相同的类型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指出的那样。