Page 1

Monadic Expression Evaluation

Page 2
Monadic Expression Evaluation
Page 3
Monadic Expression Evaluation
Page 4

Avoiding division by zero

Page 5

Looking up variables

Page 6

Combining effects?

Page 7

A monad for eval

Page 8

Combining effects

The finished monadic evaluator

evalM :: Expr -> Eval Integer
evalM (Num n) = pure n
evalM (Var x) = lookupVar x
evalM (Add a b) = (+) <$> evalM a <*> evalM b
evalM (Mul a b) = (*) <$> evalM a <*> evalM b
evalM (Div a b) = do x <- evalM a
                     y <- evalM b
                     safeDiv x y

safeDiv x 0 = divByZero
safeDiv x y = pure (x `div` y)
Page 9

Final thoughts on the monadic evaluator