Haskell 自定义数据类型、实例数和冗余
Haskell custom data type, instance Num, and redundancy
我正在 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
-- ...
而不是用另一个构造函数重复所有的事情。
你可以使用守卫。以下代码是错误的,我相信您已经注意到了:
instance Num Weight where
Wt x a + Wt y a = Wt (x + y) a
-- ...
但这很好:
instance Num Weight where
Wt x a + Wt y b | a == b = Wt (x + y) a
-- ...
请记住,如果有人试图将公斤加到磅上,除非您也处理这种情况,否则您的代码将会出错。
我正在 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
-- ...
而不是用另一个构造函数重复所有的事情。
你可以使用守卫。以下代码是错误的,我相信您已经注意到了:
instance Num Weight where
Wt x a + Wt y a = Wt (x + y) a
-- ...
但这很好:
instance Num Weight where
Wt x a + Wt y b | a == b = Wt (x + y) a
-- ...
请记住,如果有人试图将公斤加到磅上,除非您也处理这种情况,否则您的代码将会出错。