concrete-typerep-0.1: Binary and Hashable instances for TypeRep



This module defines Binary and Hashable instances for TypeRep. These are defined on a newtype of TypeRep, namely ConcreteTypeRep, for two purposes:

  • to avoid making orphan instances
  • the Hashable instance for ConcreteTypeRep may not be pure enough for some people's tastes.

As usual with Typeable, this module will typically be used with some variant of Data.Dynamic. Two possible uses of this module are:



data ConcreteTypeRep Source

Abstract type providing the functionality of TypeRep, but additionally supporting hashing and serialization.

The Eq instance is just the Eq instance for TypeRep, so an analogous guarantee holds: cTypeOf a == cTypeOf b if and only if a and b have the same type. The hashing and serialization functions preserve this equality.


Eq ConcreteTypeRep 
Show ConcreteTypeRep 
Typeable ConcreteTypeRep 
Binary ConcreteTypeRep 
Hashable ConcreteTypeRep

The Hashable instance is defined by running unsafePerformIO on typeRepKey :: TypeRep -> IO Int.

This instance actually provides a stronger guarantee than required: it is guaranteed that t1 == t2 if and only if hash t1 == hash t2.

As the documentation for typeRepKey notes, "... 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."

cTypeOf :: Typeable a => a -> ConcreteTypeRepSource

"Concrete" version of typeOf.

toTypeRep :: ConcreteTypeRep -> TypeRepSource

Converts to the underlying TypeRep

fromTypeRep :: TypeRep -> ConcreteTypeRepSource

Converts from the underlying TypeRep