Copyright | (c) The University of Glasgow CWI 2001--2004 |
---|---|
License | BSD-style (see the file libraries/base/LICENSE) |
Maintainer | libraries@haskell.org |
Stability | experimental |
Portability | portable |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
The Typeable
class reifies types to some extent by associating type
representations to types. These type representations can be compared,
and one can in turn define a type-safe cast operation. To this end,
an unsafe cast is guarded by a test for type (representation)
equivalence. The module Data.Dynamic uses Typeable for an
implementation of dynamics. The module Data.Data uses Typeable
and type-safe cast (but not dynamics) to support the "Scrap your
boilerplate" style of generic programming.
Compatibility Notes
Since GHC 7.8, Typeable
is poly-kinded. The changes required for this might
break some old programs involving Typeable
. More details on this, including
how to fix your code, can be found on the
PolyTypeable wiki page
- class Typeable a
- typeRep :: forall proxy a. Typeable a => proxy a -> TypeRep
- data a :~: b where
- typeOf :: forall a. Typeable a => a -> TypeRep
- typeOf1 :: forall t a. Typeable t => t a -> TypeRep
- typeOf2 :: forall t a b. Typeable t => t a b -> TypeRep
- typeOf3 :: forall t a b c. Typeable t => t a b c -> TypeRep
- typeOf4 :: forall t a b c d. Typeable t => t a b c d -> TypeRep
- typeOf5 :: forall t a b c d e. Typeable t => t a b c d e -> TypeRep
- typeOf6 :: forall t a b c d e f. Typeable t => t a b c d e f -> TypeRep
- typeOf7 :: forall t a b c d e f g. Typeable t => t a b c d e f g -> TypeRep
- type Typeable1 a = Typeable a
- type Typeable2 a = Typeable a
- type Typeable3 a = Typeable a
- type Typeable4 a = Typeable a
- type Typeable5 a = Typeable a
- type Typeable6 a = Typeable a
- type Typeable7 a = Typeable a
- cast :: forall a b. (Typeable a, Typeable b) => a -> Maybe b
- eqT :: forall a b. (Typeable a, Typeable b) => Maybe (a :~: b)
- gcast :: forall a b c. (Typeable a, Typeable b) => c a -> Maybe (c b)
- gcast1 :: forall c t t' a. (Typeable t, Typeable t') => c (t a) -> Maybe (c (t' a))
- gcast2 :: forall c t t' a b. (Typeable t, Typeable t') => c (t a b) -> Maybe (c (t' a b))
- data Proxy t = Proxy
- data TypeRep
- typeRepFingerprint :: TypeRep -> Fingerprint
- rnfTypeRep :: TypeRep -> ()
- showsTypeRep :: TypeRep -> ShowS
- data TyCon :: *
- tyConFingerprint :: TyCon -> Fingerprint
- tyConString :: TyCon -> String
- tyConPackage :: TyCon -> String
- tyConModule :: TyCon -> String
- tyConName :: TyCon -> String
- rnfTyCon :: TyCon -> ()
- mkTyCon3 :: String -> String -> String -> TyCon
- mkTyConApp :: TyCon -> [TypeRep] -> TypeRep
- mkAppTy :: TypeRep -> TypeRep -> TypeRep
- mkFunTy :: TypeRep -> TypeRep -> TypeRep
- splitTyConApp :: TypeRep -> (TyCon, [TypeRep])
- funResultTy :: TypeRep -> TypeRep -> Maybe TypeRep
- typeRepTyCon :: TypeRep -> TyCon
- typeRepArgs :: TypeRep -> [TypeRep]
The Typeable class
The class Typeable
allows a concrete representation of a type to
be calculated.
typeRep :: forall proxy a. Typeable a => proxy a -> TypeRep #
Takes a value of type a
and returns a concrete representation
of that type.
Since: 4.7.0.0
Propositional equality
Propositional equality. If a :~: b
is inhabited by some terminating
value, then the type a
is the same as the type b
. To use this equality
in practice, pattern-match on the a :~: b
to get out the Refl
constructor;
in the body of the pattern-match, the compiler knows that a ~ b
.
Since: 4.7.0.0
For backwards compatibility
Type-safe cast
eqT :: forall a b. (Typeable a, Typeable b) => Maybe (a :~: b) #
Extract a witness of equality of two types
Since: 4.7.0.0
gcast :: forall a b c. (Typeable a, Typeable b) => c a -> Maybe (c b) #
A flexible variation parameterised in a type constructor
Generalized casts for higher-order kinds
gcast1 :: forall c t t' a. (Typeable t, Typeable t') => c (t a) -> Maybe (c (t' a)) #
Cast over k1 -> k2
gcast2 :: forall c t t' a b. (Typeable t, Typeable t') => c (t a b) -> Maybe (c (t' a b)) #
Cast over k1 -> k2 -> k3
A canonical proxy type
A concrete, poly-kinded proxy type
Monad (Proxy *) # | |
Functor (Proxy *) # | |
Applicative (Proxy *) # | |
Foldable (Proxy *) # | |
Traversable (Proxy *) # | |
Generic1 (Proxy *) # | |
MonadPlus (Proxy *) # | |
Alternative (Proxy *) # | |
MonadZip (Proxy *) # | |
Show1 (Proxy *) # | Since: 4.9.0.0 |
Read1 (Proxy *) # | Since: 4.9.0.0 |
Ord1 (Proxy *) # | Since: 4.9.0.0 |
Eq1 (Proxy *) # | Since: 4.9.0.0 |
Bounded (Proxy k s) # | |
Enum (Proxy k s) # | |
Eq (Proxy k s) # | |
Data t => Data (Proxy * t) # | |
Ord (Proxy k s) # | |
Read (Proxy k s) # | |
Show (Proxy k s) # | |
Ix (Proxy k s) # | |
Generic (Proxy k t) # | |
Semigroup (Proxy k s) # | |
Monoid (Proxy k s) # | |
type Rep1 (Proxy *) # | |
type Rep (Proxy k t) # | |
Type representations
A concrete representation of a (monomorphic) type.
TypeRep
supports reasonably efficient equality.
typeRepFingerprint :: TypeRep -> Fingerprint #
Observe the Fingerprint
of a type representation
Since: 4.8.0.0
rnfTypeRep :: TypeRep -> () #
Helper to fully evaluate TypeRep
for use as NFData(rnf)
implementation
Since: 4.8.0.0
showsTypeRep :: TypeRep -> ShowS #
tyConFingerprint :: TyCon -> Fingerprint #
tyConString :: TyCon -> String #
Deprecated: renamed to tyConName
; tyConModule
and tyConPackage
are also available.
Observe string encoding of a type representation
tyConPackage :: TyCon -> String #
tyConModule :: TyCon -> String #
Construction of type representations
mkTyConApp :: TyCon -> [TypeRep] -> TypeRep #
Applies a kind-monomorphic type constructor to a sequence of types
mkFunTy :: TypeRep -> TypeRep -> TypeRep #
A special case of mkTyConApp
, which applies the function
type constructor to a pair of types.
Observation of type representations
splitTyConApp :: TypeRep -> (TyCon, [TypeRep]) #
Splits a type constructor application.
Note that if the type constructor is polymorphic, this will
not return the kinds that were used.
See splitPolyTyConApp
if you need all parts.
typeRepTyCon :: TypeRep -> TyCon #
Observe the type constructor of a type representation
typeRepArgs :: TypeRep -> [TypeRep] #
Observe the argument types of a type representation