- [(['_if'], Func \i->pure (Func \t->pure (Func \e->eval i >>= \(Bool b)->
- if b (eval t) (eval e))))
+ [(['_if'], Func \i->pure (Func \t->pure (Func \e->eval i >>= \(Bool b)->if b (eval t) (eval e))))
- ,(['_sub'], binop \(Int i) (Int j)->Int (i-j))
- ,(['_add'], binop \(Int i) (Int j)->Int (i+j))
- ,(['_mul'], binop \(Int i) (Int j)->Int (i*j))
- ,(['_div'], binop \(Int i) (Int j)->Int (i/j))
+ ,(['_sub'], binop \(Int i) (Int j)->Int (i-j))
+ ,(['_add'], binop \(Int i) (Int j)->Int (i+j))
+ ,(['_mul'], binop \(Int i) (Int j)->Int (i*j))
+ ,(['_div'], binop \(Int i) (Int j)->Int (i/j))
]
where
binop op = Func \l->pure (Func \r->op <$> eval l <*> eval r)
sub :: [Char] Expression Expression -> Expression
]
where
binop op = Func \l->pure (Func \r->op <$> eval l <*> eval r)
sub :: [Char] Expression Expression -> Expression
-sub ident subst (Let v b rest)
- = Let v (sub ident subst b)
- (if (v == ident) rest (sub ident subst rest))
+sub ident subst (Let v b rest) = Let v (sub ident subst b) (if (v == ident) rest (sub ident subst rest))
eval (Lit v) = pure v
eval (Var v) = gets (lookup v) >>= maybe (liftT (Left [toString v +++ " not found"])) pure
eval (App e1 e2) = eval e1 >>= \(Func v)->v e2
eval (Lit v) = pure v
eval (Var v) = gets (lookup v) >>= maybe (liftT (Left [toString v +++ " not found"])) pure
eval (App e1 e2) = eval e1 >>= \(Func v)->v e2