data Atom = LitInt Int -- Literal integer value, e.g. 2, -3, 0.. | FreeReal String -- Real-valued free variable denoted by a string, e.g. 'x', 'y', 'a1'.. deriving (Eq, Ord) -- Abstract syntax tree of an algebraic expression data Expr = Leaf Atom | Prod [Expr] -- Empty product = 1 | Sum [Expr] -- Empty sum = 0 | Pow {base :: Expr, pow :: Expr} deriving (Eq, Ord)