module VarType where { {- -- Monadic Version を試す時には必要 type M a = a; unitM :: a -> M a; unitM a = a; bindM :: M a -> (a -> M b) -> M b; m `bindM` k = k m; -} data Value = Num Double deriving (Eq, Show); showValue (Num d) = show d; type Decl = (String, Expr); data Expr = Mult Expr Expr | Add Expr Expr | Const Value | Let Decl Expr {- Let [Decl] Expr -} | Var String deriving (Eq, Show); }