On Wed, Nov 16, 2011 at 2:23 PM, Jason Dusek <span dir="ltr">&lt;<a href="mailto:jason.dusek@gmail.com">jason.dusek@gmail.com</a>&gt;</span> wrote:<br><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">&gt; Just double checked. modifySTRef is too lazy:<br>
&gt; -- |Mutate the contents of an &#39;STRef&#39;<br>
&gt; modifySTRef :: STRef s a -&gt; (a -&gt; a) -&gt; ST s ()<br>
&gt; modifySTRef ref f = writeSTRef ref . f =&lt;&lt; readSTRef ref<br>
&gt; We need Data.STRef.Strict<br>
<br>
</div>Tried a modifySTRef&#39; defined this way:<br>
<br>
modifySTRef&#39; ref f           =  do<br>
  val                       &lt;-  (f $!!) &lt;$&gt; readSTRef ref<br>
  writeSTRef ref (val `seq` val)<br>
<br>
...but there was no change in memory usage.</blockquote><div><br></div><div>Why not just</div><div><br></div><div>    modifySTRef :: STRef s a -&gt; (a -&gt; a) -&gt; ST s ()</div>    modifySTRef ref f = do</div><div class="gmail_quote">

        x &lt;- readSTRef ref</div><div class="gmail_quote">        writeSTRef ref $! f x </div><div class="gmail_quote"><br></div><div class="gmail_quote">(Note that I didn&#39;t check if modifySTRef was actually a problem in this case).</div>

<div class="gmail_quote"><br></div><div class="gmail_quote">-- Johan</div><div class="gmail_quote"><br></div>