[Haskell-cafe] GHC optimizations and unsafePerformIO - Was: Data.Typeable TypeRep Ord instance.

Felipe Almeida Lessa felipe.lessa at gmail.com
Sat Jan 1 16:04:19 CET 2011


On Sat, Jan 1, 2011 at 12:42 PM, Daniel Fischer
<daniel.is.fischer at googlemail.com> wrote:
> I don't think so, it's in IO for a reason:
>
>> -- | Returns a unique integer associated with a 'TypeRep'.  This can
>> -- be used for making a mapping with TypeReps
>> -- as the keys, for example.  It is guaranteed that @t1 == t2@
>> -- if and only if @typeRepKey t1 == typeRepKey t2 at .
>> --
>> -- It is in the 'IO' monad because the actual value of the key may
>> -- vary from run to run of the program.  You should only rely on
>> -- the equality property, not any actual key value.  The relative
>> -- ordering of keys has no meaning either.
>> --
>> typeRepKey :: TypeRep -> IO Int
>
> That also means that an Ord instance based on the keys may change from run
> to run. It's probably not a problem for applications if it's only used for
> storing TypeReps in a Map and not for programme logic (if typeOf 'a' <
> typeOf True then this else that), but it's somewhat fishy nevertheless.

The reason for putting typeRepKey inside IO is changing between runs.
So that means that compare should also be in IO.

But, if you want to have a strang Ord instance, then why not have a
strange unsafeTypeRepKey :: TypeRep -> Int?

Cheers!

-- 
Felipe.



More information about the Haskell-Cafe mailing list