{-

  Programming Languages Fall 2010
  Project
  Part 2
  Template

-}

data Operator = Add | Sub | Mul | Div deriving Show
data Poly     = C Float | V String | Op Poly Operator Poly deriving Show

eval :: Poly -> Float
eval (C x) = x
eval (Op p1 o p2) = let val1 = eval p1
		        val2 = eval p2
                      in interpret o val1 val2

interpret :: Operator -> (Float -> Float -> Float)
interpret Add = ...
interpret Sub = ...
interpret Mul = ...
interpret Div = ...

derive :: String -> Poly -> Poly
derive ...

--------------------
--  the testpoly  --
--------------------
testpoly :: Poly
-- testpoly = 4-x+3*x*x
testpoly = Op (Op (C 4) Sub (V "x")) Add (Op (C 3) Mul (Op (V "x") Mul (V "x")))


simplify :: Poly -> Poly
simplify ...

instantiate :: Substitution -> Poly -> Poly
instantiate ...

-------------------------------
--- functions to show polys ---
-------------------------------

{-
instance Show Operator where
  show Add = "+"
  show Sub = "-"
  show Mul = "*"
  show Div = "/"

instance Show Poly where
  show (C x)       = show x
  show (V x)       = x
  show (Op p o p') = "("++(show p)++(show o)++(show p')++")"
-}
