使用Haskell修改数字类型

时间:2015-04-21 21:22:01

标签: haskell instance ghc

我正在研究一个小型符号库,用Haskell执行一些计算。

为了表示符号操作,我创建了这种数据类型:

data MathExpress =                        -- A math expression
       MathDouble Double                  -- Represent a number      
     | MathAdd MathExpress MathExpress    -- Add 2 expressions 
     | MathSoust MathExpress MathExpress  -- Subtract 2 expressions
     | ...

我设法创建了一个Num实例,以便能够在我的类型+上使用运算符-MathExpress

instance Num MathExpress where
  (+) (expa) (expb)  = MathAdd expa expb
  (-) (expa) (expb)  = MathSoust expa expb
  ...

当我写信时:

( MathExpress expression ) * MathDouble 2.0

有效!

现在,我希望能够+-使用数字(DoubleInt)来更简单地写一下:

( MathExpress expression ) * 2.0

是否可以(通过创建实例或任何内容)将Haskell 推断 2.0作为MathDouble 2.0

1 个答案:

答案 0 :(得分:9)

您需要完成Num MathExpress的实施:

instance Num MathExpress where
    fromInteger n = MathDouble (fromInteger n)
    ...

fromInteger方法允许数字文字具有多态性,因此1可以解释为IntIntegerDouble,{{1在这种情况下Complex。如果您希望将MathExpress2.0这样的数字解释为42.7,那么您还需要实现MathExpress类型类(as noted by @ØrjanJohansen) ,尤其是Fractional方法,它可以与fromRational基本相同地实现。