<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">&lt;<a href="mailto:yi.codeplayer@gmail.com" target="_blank">yi.codeplayer@gmail.com</a>&gt;</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">&lt;<a href="mailto:ekirpichov@gmail.com" target="_blank">ekirpichov@gmail.com</a>&gt;</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&#39;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>&gt; module Unique ( HasUnique(..), Unique, newUnique, openUnique) where</div><div>&gt; class HasUnique m uid where</div><div>&gt;   newUniqueID :: m uid </div><div>&gt;</div><div>&gt; data Unique uid a = U !uid a</div>
<div>
&gt; </div><div>&gt; newUnique :: (HasUnique m uid, Monad m) =&gt; a -&gt; m (Unique uid a)</div><div>&gt; newUnique a = newUniqueID &gt;&gt;= \ uid -&gt; return (U uid a)</div><div>&gt;</div><div>&gt; openUnique :: (Unique m a) -&gt; a</div>

<div>&gt; openUnique (U _ x) = x</div><div>&gt;</div><div>&gt; instance (Eq uid) =&gt; Eq (Unique uid a) </div><div>&gt; instance (Ord uid) =&gt; Ord (Unique uid a) </div><div><br></div></div></div>
</div><br>