(*) (FloatLiteral a) (RationalLiteral b) = FloatLiteral $ a * (fromRational b)
abs (RationalLiteral a) = RationalLiteral $ abs a
abs (FloatLiteral a) = FloatLiteral $ abs a
+ fromInteger = RationalLiteral . fromInteger
+ negate (FloatLiteral a) = FloatLiteral $ - a
+ negate (RationalLiteral a) = RationalLiteral $ - a
signum (RationalLiteral a) = RationalLiteral $ signum a
signum (FloatLiteral a) = FloatLiteral $ signum a
- fromInteger = RationalLiteral . fromInteger
-- The special cases for multiplication by 1 are needed as a base case to avoid
-- infinite recursion when simplifying products.
(*) 1 n = n
(*) n 1 = n
(*) a b = simplify $ Product $ empty `addPair` (a, 1) `addPair` (b, 1)
- fromInteger = Literal . fromInteger
abs = UnaryFunction Abs
+ fromInteger = Literal . fromInteger
+ negate a = simplify $ Sum $ empty `addPair` (a, -1)
signum = UnaryFunction Signum