Proposal: add 'state' to the MonadState class

Twan van Laarhoven twanvl at
Mon Sep 26 16:25:44 CEST 2011

Hello list,

Currently the 'state' function is only defined for the State type (aka 
StateT Identity):

     state :: (s -> (a, s)) -> State s a
     state f = StateT (Identity . f)

But this function makes sense for all MonadState instances. I therefore 
propose to either add it to the MonadState class:

     class MonadState s m | m -> s where
         state :: (s -> (a,s)) -> m a
         state f = do s <- get
                      let (a,s') = f s
                      set s'
                      return a

or as a stand alone function like modify. I personally prefer to add it 
to the class, since that allows for a more efficient implementation. In 

     instance Monad m => MonadState s (StateT s m) where
         state = StateT (return . f)

Discussion period: 2 weeks  (ends October 10th)


More information about the Libraries mailing list