import Control.Monad.State
newtype State s a = State { runState :: s -> (a,s) }
instance Monad (State s) where
return a
= State $ \ s -> (a, s)
m >>= k
= State $ \ s -> let (a, s') = runState m s
in runState (k a) s'
instance MonadState s (State s) where
get
= State $ \ s -> (s, s)
put s
= State $ \ _ -> ((), s)
evalState :: State s a -> s -> a
evalState act = fst . runState act
execState :: State s a -> s -> s
execState act = snd . runState act