import "Prelude" data Exp = Exp String expToString :: Exp -> String expToString (Exp s) = s instance Additive Exp where zero = Exp "0" Exp a + Exp b = Exp ("(" + a + " + " + b + ")") instance Ring Exp where one = Exp "1" neg (Exp a) = Exp ("(-" + a + ")") Exp a * Exp b = Exp ("(" + a + " * " + b + ")") Exp a - Exp b = Exp ("(" + a + " - " + b + ")") fromInteger x = Exp (show x) a = Exp "a" b = Exp "b" c = Exp "c" d = Exp "d" e = Exp "e" main = expToString (a + b*c + d*e) -- ((a + (b * c)) + (d * e))