<br><br><div class="gmail_quote">On Wed, Nov 11, 2009 at 10:29 AM, David Menendez <span dir="ltr">&lt;<a href="mailto:dave@zednenem.com">dave@zednenem.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Wed, Nov 11, 2009 at 1:09 PM, Matthew Pocock<br>
&lt;<a href="mailto:matthew.pocock@ncl.ac.uk">matthew.pocock@ncl.ac.uk</a>&gt; wrote:<br>
&gt; Is there a state monad that is strict on the state but lazy on the<br>
&gt; computation? Of course, strictness in the state will force a portion of the<br>
&gt; computation to be run, but there may be significant portions of it which are<br>
&gt; not run. Would there be a way to write a state monad such that it is<br>
&gt; entirely lazy, but then to wrap either the computation or the state in an<br>
&gt; &#39;eager&#39; strategy datatype which takes care of this in a more flexible<br>
&gt; manner?<br>
<br>
</div>I think replacing &quot;put s&quot; with &quot;put $! s&quot; should guarantee that the<br>
state is evaluated.<br>
<br>
If you&#39;re using get and put in many place in the code, you could try<br>
something along these lines:<br>
<br>
newtype SStateT s m a = S { unS :: StateT s m a } deriving (Monad, etc.)<br>
<br>
instance (Monad m) =&gt; MonadState s (SStateT s m) where<br>
    get = S get<br>
    put s = S (put $! s)<br></blockquote><div><br></div><div>That&#39;s interesting, and once I have time to come back to this part of the project (I was behind schedule at this point!) I&#39;ll try something like that.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<font color="#888888"><br>
--<br>
Dave Menendez &lt;<a href="mailto:dave@zednenem.com">dave@zednenem.com</a>&gt;<br>
&lt;<a href="http://www.eyrie.org/~zednenem/" target="_blank">http://www.eyrie.org/~zednenem/</a>&gt;<br>
</font><div><div></div><div class="h5">_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</div></div></blockquote></div><br>