1 module State (State, returnS, eachS, thenS, putS, getS, useS) where 2 3 data State s x = Abs (s -> (x, s)) 4 rep :: State s x -> (s -> (x,s)) 5 rep (Abs f) = f 6 returnS :: x -> State s x 7 returnS x = Abs (\s -> (x, s)) 8 eachS :: State s x -> (x -> y) -> State s y 9 xS `eachS` f = Abs (\s -> let (x,s') = rep xS s in (f x, s')) 10 thenS :: State s x -> (x -> State s y) -> State s y 11 xS `thenS` kS = Abs (\s -> let (x,s') = rep xS s in rep (kS x) s') 12 putS :: s -> State s () 13 putS s' = Abs (\s -> ((), s')) 14 getS :: State s s 15 getS = Abs (\s -> (s,s)) 16 useS :: State s x -> s -> x 17 useS xS s = let (x,s') = rep xS s in x