module Expr0 where default (Int) -------------------------------------------- -- Expression interpreter: trivial version -- (no parsing, simple printing, no tracing) -------------------------------------------- -------------------- -- Expression trees and their fold data Expr = Lit Int | Bop AOp Expr Expr deriving (Eq, Show) fold f g (Lit n) = f n fold f g (Bop o l r) = g o (fold f g l) (fold f g r) -------------------- -- Operators, evaluation and pretty-printing data AOp = Add | Mul | Sub deriving (Eq, Show) aop f g h Add = f aop f g h Mul = g aop f g h Sub = h syn = aop "+" "*" "-" sem = aop (+) (*) (-) idex = fold Lit Bop -- identity eval = fold id sem prti = fold show inf inf o l r = par $ concat [l,syn o,r] par s = "("++ s ++")" -------------------- -- Some test data [(+:), (*:), (-:)] = map Bop [Add, Mul, Sub] t0 = (Lit 2 +: Lit 3) *: ((Lit 5 +: Lit 6) -: Lit 4) t1 = (Lit 2 *: Lit 3) +: (Lit 4 *: Lit 5) ------------------------------------------------------------