{-# Language LambdaCase #-} module Assignment where import Chi subst :: Variable -> Exp -> Exp -> Exp subst var e = \case Apply e1 e2 -> Apply (subst var e e1) (subst var e e2) Lambda x e' -> Lambda x $ if var /= x then (subst var e e') else e' Var x -> if var == x then e else Var x Const c es -> Const c $ map (subst var e) es Rec x e' -> Rec x $ if var /= x then (subst var e e') else e' Case e' branches -> Case (subst var e e') $ map substBr branches where substBr :: Br -> Br substBr (Branch c vs e') = Branch c vs $ if var `notElem` vs then (subst var e e') else e' eval' :: Exp -> Reader (Map Variable Exp) Exp eval' = undefined eval :: Exp -> Exp eval = undefined main :: IO () main = getLine >>= print . eval . parse