我正在研究一个小型符号库,用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 推断 2.0
作为MathDouble 2.0
?
答案 0 :(得分:9)
您需要完成Num MathExpress
的实施:
instance Num MathExpress where
fromInteger n = MathDouble (fromInteger n)
...
fromInteger
方法允许数字文字具有多态性,因此1
可以解释为Int
,Integer
,Double
,{{1在这种情况下Complex
。如果您希望将MathExpress
或2.0
这样的数字解释为42.7
,那么您还需要实现MathExpress
类型类(as noted by @ØrjanJohansen) ,尤其是Fractional
方法,它可以与fromRational
基本相同地实现。