2009/1/26 Alberto G. Corona <agocorona@gmail.com>
Sometimes the StableName library gives different values for the samr function:

First, unsafePerformIO is not subject to referential transparency.  You have to ensure it yourself.  That's why it's unsafe.

Now, did you read the StableName documentation?  From the docs:

Stable names have the following property:  if sn1 :: StableName and sn2 :: StableName and sn1 == sn2 then sn1 and sn2 were created by calls to makeStableName on the same object.  The reverse is not necessarily true: if two stable names are not equal, then the objects they name may still be equal.
 
So the behavior you cite is perfectly reasonable: does not break referential transparency (unsafePerformIO is the culprit here), and is consistent with the documentation.

Luke

Sometines gives two alternate values. I checked it in ghc-6.10.1 under windows and in ghc-6.8.2 under Linux:

This is an example

Prelude> System.Mem.StableName.hashStableName.System.IO.Unsafe.unsafePerformIO $
 System.Mem.StableName.makeStableName (*)
15
Prelude> System.Mem.StableName.hashStableName.System.IO.Unsafe.unsafePerformIO $
 System.Mem.StableName.makeStableName (*)
14
Prelude> System.Mem.StableName.hashStableName.System.IO.Unsafe.unsafePerformIO $
 System.Mem.StableName.makeStableName (*)
15
Prelude> System.Mem.StableName.hashStableName.System.IO.Unsafe.unsafePerformIO $
 System.Mem.StableName.makeStableName (*)
14

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe