Wow, this looks like a bug to me. If it&#39;s not a bug, then it&#39;s horribly  unintuitive.<br>I extended your example in an effort to figure out what was going on. Apparently weak pointers loath live IORefs:<br><br>import Data.IORef<br>
import Data.Maybe<br>import System.Mem<br>import System.Mem.Weak<br><br>import Control.Monad<br><br>data A = A String<br>data B = B String (IORef Int)<br>showA (A s) = s<br>showB (B s _) = s<br><br>main = do<br> -- works as expected:<br>
 ref &lt;- return $ A &quot;A&quot;<br> ptr &lt;- mkWeak ref 21 Nothing<br> performGC<br> print . isNothing =&lt;&lt; deRefWeak ptr<br> print (showA ref)<br> <br> -- why doesn&#39;t this work?<br> ref &lt;- liftM (B &quot;B&quot;) $ newIORef 42<br>
 ptr &lt;- mkWeak ref 21 Nothing<br> performGC<br> print . isNothing =&lt;&lt; deRefWeak ptr<br> print (showB ref)<br> <br> -- this works, wtf??? <br> ref &lt;- liftM (B &quot;B&quot;) $ return undefined<br> ptr &lt;- mkWeak ref 21 Nothing<br>
 performGC<br> print . isNothing =&lt;&lt; deRefWeak ptr<br> print (showB ref)<br><br><br>I don&#39;t think this is the expected behavior. The docs on Weak pointers don&#39;t mention anything like this. I suspect something in the GC is getting confused by the IORef somehow.<br>
<br>- Job<br><br><br><br><div class="gmail_quote">2009/11/2 Patai Gergely <span dir="ltr">&lt;<a href="mailto:patai_gergely@fastmail.fm">patai_gergely@fastmail.fm</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">&gt; Could mkWeakPair do what you want?<br>
&gt; <a href="http://haskell.org/ghc/docs/latest/html/libraries/base/System-Mem-Weak.html#v:mkWeakPair" target="_blank">http://haskell.org/ghc/docs/latest/html/libraries/base/System-Mem-Weak.html#v:mkWeakPair</a><br>
</div>No, it&#39;s just a convenience function that doesn&#39;t help much, because the<br>
value already refers to the IORef anyway.<br>
<br>
Here&#39;s a minimal example to illustrate the problem:<br>
<br>
import Data.IORef<br>
import Data.Maybe<br>
import System.Mem<br>
import System.Mem.Weak<br>
<br>
main = do<br>
  ref &lt;- newIORef 42<br>
  ptr &lt;- mkWeak ref 21 Nothing<br>
  performGC<br>
  print . isNothing =&lt;&lt; deRefWeak ptr<br>
  print =&lt;&lt; readIORef ref<br>
<br>
Depending on whether you compile with optimisations, the weak reference<br>
might be reported dead, even though the IORef is alive and kicking.<br>
Switching to mkWeakPair (or just mentioning ref in the value somehow)<br>
doesn&#39;t affect that.<br>
<div class="im"><br>
&gt; Or are you trying to do something else?<br>
</div>The goal is to create mutable objects whose update codes are tracked by<br>
the main program, but they can be thrown out when all the other<br>
references to the objects are lost. Creating weak pointers with MutVar#s<br>
seems to do the trick, but I&#39;m not confident if it is a solution I can<br>
trust...<br>
<br>
Gergely<br>
<font color="#888888"><br>
--<br>
<a href="http://www.fastmail.fm" target="_blank">http://www.fastmail.fm</a> - A fast, anti-spam email service.<br>
</font><div><div></div><div class="h5"><br>
_______________________________________________<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>