data Atree = Number Int | Variable String | Plus Atree Atree | Minus Atree | Times Atree Atree -- (5 - x) * (2y - (x + 7))) t :: Atree t = Times (Plus (Number 5) (Minus (Variable "x"))) ( Plus (Times (Number 2) (Variable "y")) (Minus (Plus (Variable "x") (Number 7))) ) type Polynomial = [Monomial] type Monomial = (Int, [String]) polynomial :: Atree -> Polynomial polynomial (Number n) = [(n, [])] polynomial (Variable v) = [(1, [v])] polynomial (Plus e1 e2) = polynomial e1 ++ polynomial e2 polynomial (Minus e) = map (\(c, xs) -> (-c, xs)) (polynomial e) polynomial (Times e1 e2) = concatMap (\(c1, xs1) -> map (\(c2, xs2) -> (c1 * c2, xs1 ++ xs2)) (polynomial e2)) (polynomial e1)