<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>I may be wrong, but I think the original SNMap was a map from 'StableName's to the specific values they were derived from, which also (IIRC) had some weak referencing aspect as well. &nbsp;Using them as keys for arbitrary elements of the phantom type is actually not type-safe, because equality of 'StableName's does not imply equality of types. &nbsp;Here's a simple demonstration (also at [1] with slightly more commentary) which&nbsp;defines a working equivalent of 'return unsafeCoerce' &nbsp;without directly using any "unsafe" function:&nbsp;</div><div><br></div><div>&gt; import Prelude hiding (lookup)</div><div>&gt;&nbsp;</div><div>&gt; import Data.Functor.Identity</div><div>&gt; import System.Mem.StableName</div><div>&gt; import System.Mem.StableName.Map</div><div>&gt;&nbsp;</div><div>&gt; unsafeCoerceIO :: IO (a -&gt; b)</div><div>&gt; unsafeCoerceIO = do</div><div>&gt; &nbsp; &nbsp; sn1 &lt;- makeStableName undefined</div><div>&gt; &nbsp; &nbsp; sn2 &lt;- makeStableName undefined</div><div>&gt; &nbsp; &nbsp;&nbsp;</div><div>&gt; &nbsp; &nbsp; return $ \x -&gt;</div><div>&gt; &nbsp; &nbsp; &nbsp; &nbsp; let m = singleton sn1 (Identity x)</div><div>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Just (Identity y) = lookup sn2 m</div><div>&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;in y</div><div>&gt;&nbsp;</div><div>&gt; main :: IO ()</div><div>&gt; main = do</div><div>&gt; &nbsp; &nbsp; unsafeCoerce &lt;- unsafeCoerceIO</div><div>&gt; &nbsp; &nbsp; unsafeCoerce () "what did you do to my argument stack?!"</div><div><br></div><div>-- James</div><div><br></div><div>[1] <a href="https://github.com/mokus0/junkbox/blob/master/Haskell/TypeExperiments/UnsafeStableMap.hs">https://github.com/mokus0/junkbox/blob/master/Haskell/TypeExperiments/UnsafeStableMap.hs</a>&nbsp;</div><div><br></div><div><div>On Sep 22, 2011, at 10:50 AM, Edward Kmett wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">I have a "stable-maps" package that provides lookup and inserting into a map via stable names.<div><br></div><div>-Edward</div><div><br><div class="gmail_quote">On Thu, Sep 22, 2011 at 5:47 AM, Sean Leather <span dir="ltr">&lt;<a href="mailto:leather@cs.uu.nl">leather@cs.uu.nl</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">There is an abstract type called SNMap for stable names referred to in [1]. This has apparently disappeared from GHC a long time ago. Is it still available somewhere, or is there a suitable replacement for it?<div>
<br></div>

<div>Regards,</div><div>Sean<br><div><br></div><div>[1] "Stretching the storage manager: weak pointers and stable names in Haskell" -&nbsp;<a href="http://research.microsoft.com/apps/pubs/default.aspx?id=67497" target="_blank">http://research.microsoft.com/apps/pubs/default.aspx?id=67497</a></div>


</div>
<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>
<br></blockquote></div><br></div>
_______________________________________________<br>Haskell-Cafe mailing list<br><a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>http://www.haskell.org/mailman/listinfo/haskell-cafe<br></blockquote></div><br></body></html>