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)
它的工作原理!
现在,我希望能够使用+和-数字(Double或Int)编写更简单:
( MathExpress expression ) * 2.0
Run Code Online (Sandbox Code Playgroud)
是否有可能(通过创建实例或任何东西)使Haskell 推断 2.0为MathDouble 2.0?
你需要完成以下的实现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.