<div class="gmail_quote">2009/1/26 Alberto G. Corona <span dir="ltr">&lt;<a href="mailto:agocorona@gmail.com">agocorona@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div>Sometimes the StableName library gives different values for the samr function:</div></blockquote><div><br></div><div>First, unsafePerformIO is not subject to referential transparency. &nbsp;You have to ensure it yourself. &nbsp;That&#39;s why it&#39;s unsafe.</div>
<div><br></div><div>Now, did you read the StableName documentation? &nbsp;From the docs:</div><div><br></div><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
Stable names have the following property: &nbsp;if sn1 :: StableName and sn2 :: StableName and sn1 == sn2 then sn1 and sn2 were created by calls to makeStableName on the same object. &nbsp;<span class="Apple-style-span" style="font-style: italic;">The reverse is not necessarily true:</span>&nbsp;if two stable names are not equal, then the objects they name may still be equal.</blockquote>
<div>&nbsp;</div><div>So the behavior you cite is perfectly reasonable: does not break referential transparency (unsafePerformIO is the culprit here), and is consistent with the documentation.</div><div><br></div><div>Luke</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div> Sometines gives two alternate values. I checked it in ghc-6.10.1 under windows and in ghc-6.8.2 under Linux:</div>
<div><br></div><div>This is an example</div>
<div><br></div><div>Prelude&gt; System.Mem.StableName.hashStableName.System.IO.Unsafe.unsafePerformIO $</div><div>&nbsp;System.Mem.StableName.makeStableName (*)</div><div>15</div><div>Prelude&gt; System.Mem.StableName.hashStableName.System.IO.Unsafe.unsafePerformIO $</div>

<div>&nbsp;System.Mem.StableName.makeStableName (*)</div><div>14</div><div>Prelude&gt; System.Mem.StableName.hashStableName.System.IO.Unsafe.unsafePerformIO $</div><div>&nbsp;System.Mem.StableName.makeStableName (*)</div><div>15</div>

<div>Prelude&gt; System.Mem.StableName.hashStableName.System.IO.Unsafe.unsafePerformIO $</div><div>&nbsp;System.Mem.StableName.makeStableName (*)</div><div>14</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>