-- Simple State Monad -- This is provided by GHC's Control.Monad.State, which implements it -- in terms of the more general state monad transformer. module State where data State state value = State { stateRunner :: state -> (value, state) } runState :: State state value -> state -> (value, state) runState action initialState = (stateRunner action) initialState evalState :: State state value -> state -> value evalState action initialState = let (value, _finalState) = runState action initialState in value execState :: State state value -> state -> state execState action initialState = let (_value, finalState) = runState action initialState in finalState instance Monad (State state) where return value = State (\ state -> (value, state)) action >>= function = State (\ firstState -> let (intermediateValue, secondState) = runState action firstState in runState (function intermediateValue) secondState) fail = error get :: State a a get = State (\ state -> (state, state)) put :: state -> State state () put newState = State (\ _oldState -> ((), newState))