[Haskell-cafe] DataKinds + KindSignatures question

Roman Cheplyaka roma at ro-che.info
Thu Nov 27 10:26:51 UTC 2014


On 27/11/14 12:04, Wojtek Narczyński wrote:
> I must stop thinking of '*' as some of wildcard. 

Totally.

> Oh, so Proxy can be understood as a type level function from 'CmdKind'
> to '*'?

Sure. In fact, any type constructor can be seen as a (possibly nullary)
type function:

Prelude> :k Maybe
Maybe :: * -> *

Maybe is a type function from types (*) to types (*).

Prelude Control.Monad.State> :k StateT
StateT :: * -> (* -> *) -> * -> *

StateT (not to be confused with StateT on the value level that has type
(s -> m (a, s)) -> StateT s m a) is a type function of three arguments,
two of them of kind * and one of kind (* -> *).

Now let's look at Proxy:

Prelude Data.Proxy> :k Proxy
Proxy :: k -> *

Proxy is declared as a kind-polymorphic type (see PolyKinds). Here k is
actually a "wildcard" (a kind variable that can be instantiated with any
kind). Thus, you can specialize Proxy to be of kind * -> *, or (* -> *)
-> *, or MyKind -> *. However, since the type Proxy k has a value (also
called Proxy), the return kind of the Proxy type function is necessarily *.

You can't build a type function returning a non-* kind using a data or
newtype declaration. You can do it, however, using type families.

Roman
Roman


More information about the Haskell-Cafe mailing list