这是我写的一些定义,以避免混合货币
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
data EUR
data USD
newtype Amount a = Amount Double deriving (Fractional, Num, Show)
eur :: Double -> Amount EUR
eur = Amount
usd :: Double -> Amount USD
usd = Amount
usd 34 + usd 3
按预期进行类型检查usd 33 + eur 33
是预期的编译错误- 我很惊讶,但
usd 33 + 3
根据编译器可以。我想避免的东西,但不明白。我怀疑这是因为Num
实例,但是与第二种情况有什么区别?
你能解释一下为什么usd 33 + 3
编译以及是否可以让类型检查器拒绝这个表达式。