¿Es posible obtener el tipo de constructor de tipo en Haskell?

Estoy trabajando con Data.Typeable y, en particular, quiero poder generar tipos correctos de un tipo particular (digamos*) El problema con el que me encuentro es que TypeRep nos permite hacer lo siguiente (trabajar con la versión en GHC 7.8):

let maybeType = typeRep (Proxy :: Proxy Maybe)
let maybeCon = fst (splitTyConApp maybeType)
let badType = mkTyConApp maybeCon [maybeType]

aquíbadType es, en cierto sentido, la representación del tipo Quizás Quizás, que no es un tipo válido de ningún tipo:

> :k Maybe (Maybe)

<interactive>:1:8:
    Expecting one more argument to ‘Maybe’
    The first argument of ‘Maybe’ should have kind ‘*’,
      but ‘Maybe’ has kind ‘* -> *’
    In a type in a GHCi command: Maybe (Maybe)

No estoy buscando aplicar esto a nivel de tipo, pero me gustaría poder escribir un programa que sea lo suficientemente inteligente como para evitar construir tales tipos en tiempo de ejecución. Puedo hacer esto con términos de nivel de datos conTypeRep. Idealmente, tendría algo como

data KindRep = Star | KFun KindRep KindRep

y tiene una funciónkindOf conkindOf Int = Star (probablemente realmentekindOf (Proxy :: Proxy Int) = Star) ykindOf Maybe = KFun Star Star, para poder "verificar" mi valor TypeRep.

Creo que puedo hacer esto manualmente con una clase de tipo polykinded comoTypeable, pero preferiría no tener que escribir mis propias instancias para todo. También preferiría no volver a GHC 7.6 y usar el hecho de que hay clases de tipos separadas para tipos Typeable de diferentes tipos. Estoy abierto a los métodos que obtienen esta información de GHC.

Respuestas a la pregunta(1)

Su respuesta a la pregunta