No, because it Numdoesn’t have the concept of division, or, in terms of C ++, because it’s not dynamic_cast<...>in Haskell.
You can enter your own style:
class HasDivOp a where
divOp :: a -> a -> a
instance HasDivOp Int where divOp = div
instance HasDivOp Integer where divOp = div
instance HasDivOp Double where divOp = (/)
instance HasDivOp Float where divOp = (/)
And then you have the only function that takes the correct one divOp:
toVal :: (Num a, HasDivOp a) => (Fraction a) -> a
toVal (Constant a) = a
toVal (Rational a b) = toVal a `divOp` toVal b
- :
divG :: (a -> b) -> (a -> a -> b) -> Fraction a -> b
divG p _ (Constant x) = p x
divG p f (Rational num den) = f (divG p f num) (divF p f den)
a b divF, a b a b, Fraction a b. a = b, :
divF :: (a -> a -> a) -> Fraction a -> a
divF = divG id
toVal1, toVal2 divF:
toVal1 :: Integral n => Fraction n -> Fraction n -> n
toVal1 = divF div
toVal2 :: Fractional n => Fraction n -> Fraction n -> n
toVal2 = divF (/)
toVal toVal1 :
toVal1 (Rational (Rational 2 3) (Rational 2 3)) = 0 :: Int
x div x 1 x /= 0. Fraction, :
rationalDiv :: Integral n => Fraction a -> Fraction a -> Fraction a
rationalDiv (Constant a ) (Constant c ) = Rational a c
rationalDiv (Constant a ) (Rational c d) = Rational (a * d) c
rationalDiv (Rational a b) (Constant c ) = Rational a (b * c)
rationalDiv (Rational a b) (Rational c d) = Rational (a * d) (b * c)
, Fraction * Num. , :
toVal3 :: Integral n => Fraction n -> n
toVal3 = divF div . divF rationalDiv
1 . : , Num , , .