implementation module Simple import StdString import WhileCommon import Common instance toString Stm where toString (Ass v a) = v <+ " := " <+ a toString (If b s1 s2) = "if " <+ b <+ " then " <+ s1 <+ " else " <+ s2 toString (While b s) = "while " <+ b <+ " do " <+ s toString Skip = "skip" toString (Compose s1 s2) = s1 <+ "; " <+ s2 instance run Stm where run :: Stm State -> Either Error State run (Ass v e) st // Assign e to v = pure (\w -> if (w == v) (eval e st) (st w)) run (If b s1 s2) st // If b then s1 else s2 = eval b st >>= \r -> run (if r s1 s2) st run w=:(While b s) st // While b do s = eval b st >>= \r -> if r (run s st >>= run w) (pure st) run Skip st // Skip = pure st run (Compose s1 s2) st // s1 ; s2 = run s1 st >>= run s2