module deep import StdEnv :: DSL = Lit Int | Plus DSL DSL | Div DSL DSL eval :: DSL -> Int eval (Lit i) = i eval (Plus x y) = eval x + eval y eval (Div x y) = eval x / eval y //Start = eval (Plus (Lit 41) (Lit 1)) import Control.Applicative import Control.Monad import Data.Functor import Data.Maybe evalM :: DSL -> Maybe Int evalM (Lit i) = pure i evalM (Plus x y) = (+) <$> evalM x <*> evalM y evalM (Div x y) = evalM x >>= \x->evalM y >>= \y->case y of 0 = Nothing x = Just (x / y) Start = evalM (Plus (Lit 41) (Lit 1))