Proxy package:base
Definition of a Proxy type (poly-kinded in GHC)
Proxy is a type that holds no data, but has a phantom parameter
of arbitrary type (or even kind). Its use is to provide type
information, even though there is no value available of that type (or
it may be too costly to create one).
Historically,
Proxy :: Proxy a is a safer
alternative to the
undefined :: a idiom.
>>> Proxy :: Proxy (Void, Int -> Int)
Proxy
Proxy can even hold types of higher kinds,
>>> Proxy :: Proxy Either
Proxy
>>> Proxy :: Proxy Functor
Proxy
>>> Proxy :: Proxy complicatedStructure
Proxy
The type constructor
Proxy# is used to bear witness to some
type variable. It's used when you want to pass around proxy values for
doing things like modelling type applications. A
Proxy# is not
only unboxed, it also has a polymorphic kind, and has no runtime
representation, being totally free.
A concrete, promotable proxy type, for use at the kind level. There
are no instances for this because it is intended at the kind level
only
asProxyTypeOf is a type-restricted version of
const. It
is usually used as an infix operator, and its typing forces its first
argument (which is usually overloaded) to have the same type as the
tag of the second.
>>> import GHC.Internal.Word
>>> :type asProxyTypeOf 123 (Proxy :: Proxy Word8)
asProxyTypeOf 123 (Proxy :: Proxy Word8) :: Word8
Note the lower-case
proxy in the definition. This allows any
type constructor with just one argument to be passed to the function,
for example we could also write
>>> import GHC.Internal.Word
>>> :type asProxyTypeOf 123 (Just (undefined :: Word8))
asProxyTypeOf 123 (Just (undefined :: Word8)) :: Word8