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