<div class="gmail_quote"><div class="gmail_quote"><div class="im">On Tue, Jul 19, 2011 at 11:14 PM, yi huang <span dir="ltr"><<a href="mailto:yi.codeplayer@gmail.com" target="_blank">yi.codeplayer@gmail.com</a>></span> wrote:<br>
</div><div class="im"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="gmail_quote"><div>2011/7/20 Eugene Kirpichov <span dir="ltr"><<a href="mailto:ekirpichov@gmail.com" target="_blank">ekirpichov@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
reallyUnsafePointerEq#, and it really is as unsafe as it sounds :)<br>
<br></blockquote></div><div>Why is it so unsafe? i can't find any documentation on it. </div><div>I think always compare pointer first is a good optimization.</div></div></blockquote><div><br></div></div><div>Any number of conditions could make it fail, but most especially GC.</div>
<div><br></div><div>It is almost always better to explicitly model a property when you want it. Uniqueness based on construction, for example, can be modeled with a monad and protected by an ADT.</div><div><br></div><div>
<div>> module Unique ( HasUnique(..), Unique, newUnique, openUnique) where</div><div>> class HasUnique m uid where</div><div>> newUniqueID :: m uid </div><div>></div><div>> data Unique uid a = U !uid a</div>
<div>
> </div><div>> newUnique :: (HasUnique m uid, Monad m) => a -> m (Unique uid a)</div><div>> newUnique a = newUniqueID >>= \ uid -> return (U uid a)</div><div>></div><div>> openUnique :: (Unique m a) -> a</div>
<div>> openUnique (U _ x) = x</div><div>></div><div>> instance (Eq uid) => Eq (Unique uid a) </div><div>> instance (Ord uid) => Ord (Unique uid a) </div><div><br></div></div></div>
</div><br>