Haskell自定义数据类型,实例Num和冗余

eph*_*ion 2 haskell types instance

我正在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...
Run Code Online (Sandbox Code Playgroud)

有没有办法为UnitNum实例定义指定泛型类型?指定类似的东西会很好:

instance Num Weight where
  Wt x a + Wt y a = Wt (x + y) a
  -- ...
Run Code Online (Sandbox Code Playgroud)

而不是用其他构造函数重复所有内容.

Sil*_*olo 5

你可以使用警卫.以下代码是错误的,因为我相信您已经注意到:

instance Num Weight where
    Wt x a + Wt y a = Wt (x + y) a
    -- ...
Run Code Online (Sandbox Code Playgroud)

但这很好:

instance Num Weight where
    Wt x a + Wt y b | a == b = Wt (x + y) a
    -- ...
Run Code Online (Sandbox Code Playgroud)

请记住,如果有人试图将磅数增加到磅数,那么除非你处理这种情况,否则你的代码会出错.