【发布时间】:2015-02-23 11:26:05
【问题描述】:
我正在 Haskell 中开发一小组举重实用程序作为学习练习。我已经定义了一个数据类型Weight 这样:
data Weight = Wt Float Unit
deriving (Show, Eq)
data Unit = Lb | Kg
deriving (Show, Eq)
instance Num Weight where
Wt x Lb + Wt y Lb = Wt (x + y) Lb
Wt x Lb * Wt y Lb = Wt (x * y) Lb
negate (Wt x Lb) = Wt (negate x) Lb
abs (Wt x Lb) = Wt (abs x) Lb
signum (Wt x Lb) = Wt (signum x) Lb
fromInteger x = Wt (fromInteger x) Lb
-- Repeat for Kg...
有没有办法在 Num 实例定义中为 Unit 指定泛型类型?最好指定如下内容:
instance Num Weight where
Wt x a + Wt y a = Wt (x + y) a
-- ...
而不是使用其他构造函数重复所有内容。
【问题讨论】:
-
当心!公斤是质量单位,不是重量。 SI(派生)重量单位是牛顿,等于 1 kg m/s^2。
-
您是否允许将 Kg 和 Lb 加在一起?否则,考虑使用幻像类型来静态保证这不会发生。