On Mon, Sep 26, 2011 at 10:41 AM, Antoine Latter <aslatter@gmail.com> wrote:
On Mon, Sep 26, 2011 at 9:25 AM, Twan van Laarhoven <twanvl@gmail.com> wrote:
> 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
>

I am 100% behind this change. 

It has been on the short list of changes that I want to make to mtl.

The main reason that I like it aside from the fact that it witnesses the canonical monad homomorphism from State is that it yields more efficient definitions for functions like modify, and the often-needed but needlessly expensive operations where you bump a counter _and_ want the result for something like a fresh variable supply.

I would like to encourage further public discussion.