On Jul 19, 2011, at 11:34 PM, Levent Erkok wrote:
> import System.Mem.StableName
> 
> areEqual :: Eq a => a -> a -> IO Bool
> areEqual x y = do
>   sx <- hashStableName `fmap` (x `seq` makeStableName x)
>   sy <- hashStableName `fmap` (y `seq` makeStableName y)
>   return $ (sx == sy) || x == y

One correction to the above code: Since we're actually comparing hashes, 
there's a non-zero chance that we might get a hash-collision; thus incorrectly 
identifying two different objects to be the same even though they have 
different stable names. To accommodate for that, you can use the hashes to 
index into a look-up table and then do a linear-scan to make sure it's an 
object that you've seen before. So the above code is *not* going to work for 
your purposes in general, but it can be extended to handle such equalities if 
you can afford to carry around the hash-table with you and be disciplined in 
how you perform your equality tests. Again, see Andy's paper (section 11) for 
further details on how he this problem can be handled in general.

-Levent.





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

Reply via email to