修改号码类型 Haskell

Modify type of number with Haskell

我正在开发一个小型符号库以使用 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 infer 2.0 作为 MathDouble 2.0 ?

您需要完成 Num MathExpress 的实施:

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

fromInteger 方法允许数字文字具有多态性,因此 1 可以解释为 IntIntegerDoubleComplex,或者在本例中为 MathExpress。如果你想让像 2.042.7 这样的数字被解释为 MathExpress 那么你还需要实现 Fractional 类型类() ,特别是 fromRational 方法,其实现方式与 fromInteger.

基本相同