使用Haskell修改数字的类型

使用Haskell修改数字的类型,haskell,instance,ghc,Haskell,Instance,Ghc,我正在开发一个小型符号库,用Haskell进行一些计算 为了表示符号操作,我创建了以下数据类型: data MathExpress = -- A math expression MathDouble Double -- Represent a number | MathAdd MathExpress MathExpress -- Add 2 expressions

我正在开发一个小型符号库,用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
它在工作

现在,我希望能够将
+
-
与数字一起使用(
Double
Int
)来编写更简单的代码:

( MathExpress expression ) * 2.0

是否有可能(通过创建实例或任何东西)将Haskell推断为
MathDouble 2.0

您需要完成
Num MathExpress
的实现:

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

fromInteger
方法允许数值文本具有多态性,因此
1
可以解释为
Int
Integer
Double
Complex
,或者在本例中是
MathExpress
。如果您想将像
2.0
42.7
这样的数字解释为
MathExpress
,那么您还需要实现
fractive
typeclass(),特别是
fromRational
方法,对于
2.0
,它的实现基本上与
fromInteger

相同,您还需要
fractal
类及其
fromRational
方法。