data State s a = State ( s -> (a, s) ) next :: State [b] b next = State $ \ xs -> (head xs, tail xs) instance Monad ( State s ) where return x = State $ \ s -> ( x, s ) State f >>= g = State $ \ s -> let (a, t) = f s ; State h = g a in h t evalState :: State s a -> s -> a evalState (State f) s = let (a,t) = f s in a