Type witness

From HaskellWiki

A type witness is a value that represents one of a range of possible types. When implemented as generalised algebraic datatypes (GADTs), type witness can be used to perform dynamic casts.

Types a and b may or may not be the same type. We wish to perform the cast a -> Maybe b, or more generally, p a -> Maybe (p b) for any p, depending on whether a and b are the same type. This can be done with GADTs if we have "witnesses" for the two types:

dynamicCast :: Witness a -> Witness b -> p a -> Maybe (p b)

A simple witness type might be defined over the Int, Bool and Char types like so: