<div>On Mon, Sep 26, 2011 at 10:41 AM, Antoine Latter <span dir="ltr">&lt;<a href="mailto:aslatter@gmail.com">aslatter@gmail.com</a>&gt;</span> wrote:</div><div><div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Mon, Sep 26, 2011 at 9:25 AM, Twan van Laarhoven &lt;<a href="mailto:twanvl@gmail.com">twanvl@gmail.com</a>&gt; wrote:<br>
&gt; Hello list,<br>
&gt;<br>
&gt;<br>
&gt; Currently the &#39;state&#39; function is only defined for the State type (aka<br>
&gt; StateT Identity):<br>
&gt;<br>
&gt;    state :: (s -&gt; (a, s)) -&gt; State s a<br>
&gt;    state f = StateT (Identity . f)<br>
&gt;<br>
&gt; But this function makes sense for all MonadState instances. I therefore<br>
&gt; propose to either add it to the MonadState class:<br>
&gt;<br>
&gt;    class MonadState s m | m -&gt; s where<br>
&gt;        ...<br>
&gt;        state :: (s -&gt; (a,s)) -&gt; m a<br>
&gt;        state f = do s &lt;- get<br>
&gt;                     let (a,s&#39;) = f s<br>
&gt;                     set s&#39;<br>
&gt;                     return a<br>
&gt;<br></div></blockquote><div><br></div><div>I am 100% behind this change. </div><div><br></div><div>It has been on the short list of changes that I want to make to mtl.<div><br></div></div><div>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.</div>
<div><br></div><div>I would like to encourage further public discussion.</div></div></div></div>