module Demo where {- The definitions of `StateT`, `ExceptT` and `Identity` come from separate modules in the `mtl` library. -} import Data.Function ((&)) import Control.Monad.Identity ( Identity(runIdentity) ) import Control.Monad.State ( StateT(runStateT), MonadState(put, get) ) import Control.Monad.Except ( ExceptT, MonadError(throwError), runExceptT ) import ParserLib (Parser) import qualified ParserLib as P import Data.Char (isAlpha) import Control.Applicative -- Simple language of expressions. Constants, Variables (for State), and Division (for errors) data Expr = Val Int | Var Char | Add Expr Expr | Div Expr Expr deriving (Show) ok :: Expr ok = Div (Val 84) (Add (Val 1) (Val 1)) fine :: Expr fine = Div (Val 84) (Add (Val 1) (Var 'x')) err :: Expr err = Div (Var 'x') (Val 0) -- Parse (wsP, stringP, parens, name, int, bop, exp) -- Eval Bad -- Eval Maybe -- Eval Either -- Eval State -- StateT