使用Haskell修改数字类型

Jea*_*ouX 4 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
     | ...
Run Code Online (Sandbox Code Playgroud)

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

instance Num MathExpress where
  (+) (expa) (expb)  = MathAdd expa expb
  (-) (expa) (expb)  = MathSoust expa expb
  ...
Run Code Online (Sandbox Code Playgroud)

当我写:

( MathExpress expression ) * MathDouble 2.0
Run Code Online (Sandbox Code Playgroud)

它的工作原理!

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

( MathExpress expression ) * 2.0
Run Code Online (Sandbox Code Playgroud)

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

bhe*_*ilr 9

你需要完成以下的实现Num MathExpress:

instance Num MathExpress where
    fromInteger n = MathDouble (fromInteger n)
    ...
Run Code Online (Sandbox Code Playgroud)

fromInteger方法是允许数字文字是多态的,所以1可以理解为Int,Integer,Double,Complex,或在这种情况下MathExpress.如果你想要一个像2.0或被42.7解释为a的数字MathExpress那么你还需要实现Fractional类型类(如@ØrjanJohansen所述),特别是fromRational方法,它可以基本上相同地实现fromInteger.

  • 对于`2.0`,你也需要`Fractional`类和`fromRational`方法. (3认同)