Merge branch 'master' of git.martlubbers.net:clean-tests
[clean-tests.git] / deep.icl
1 module deep
2
3 import StdEnv
4
5 :: DSL
6 = Lit Int
7 | Plus DSL DSL
8 | Div DSL DSL
9
10 eval :: DSL -> Int
11 eval (Lit i) = i
12 eval (Plus x y) = eval x + eval y
13 eval (Div x y) = eval x / eval y
14
15 //Start = eval (Plus (Lit 41) (Lit 1))
16
17 import Control.Applicative
18 import Control.Monad
19 import Data.Functor
20 import Data.Maybe
21
22 evalM :: DSL -> Maybe Int
23 evalM (Lit i) = pure i
24 evalM (Plus x y) = (+) <$> evalM x <*> evalM y
25 evalM (Div x y) = evalM x >>= \x->evalM y >>= \y->case y of
26 0 = Nothing
27 x = Just (x / y)
28
29 Start = evalM (Plus (Lit 41) (Lit 1))