2017-01-21 3 views
5

Parcourir les églefin de divers paquets que je viens souvent le long des documentations d'instance qui ressemblent à ceci (Control.Category):Qu'est-ce que * (étoile) ou d'autres types signifient dans une liste d'instance de haddock

Category k (Coercion k) 
Category * (->) 

ou ce (Control.Monad.Trans.Identity):

MonadTrans (IdentityT *) 

Que signifie exactement la signature de type ici? Il n'apparaît pas dans la source, mais j'ai déjà remarqué qu'il semble se produire dans les modules qui utilisent l'extension PolyKinds. Je suppose que c'est probablement comme un TypeApplication mais avec un genre. Donc, par exemple le dernier exemple signifie que IdentityT est un transformateur monad si son premier argument a le type *.

Mes questions sont les suivantes:

  • Mon interprétation est correcte et qu'est-ce que la signature de type référence? Par exemple, comment dois-je savoir que k est un type et non un type? Ou dois-je juste connaître l'arité de Category?
  • Quel est le code source analogique à cette syntaxe?

Je ne demande pas d'explication sur les types.

Répondre

4

To quote Richard Eisenberg’s recent post on the haskell-cafe mailing list:

Haddock peine parfois à rendre les types avec -XPolyKinds activé. Le problème est que GHC n'a généralement pas besoin d'écrire des arguments aimables et qu'il ne les imprime pas (sauf si vous dites -fprint-explicit-kinds). Mais Haddock, je crois, imprime les types à chaque fois que -XPolyKinds est activé. Donc les deux définitions différentes sont vraiment les mêmes: c'est juste qu'un module a -XPolyKinds et l'autre non. Le * est le type de types ordinaires. Donc Int a genre * (nous écrivons Int :: *) tandis que Maybe a genre * -> *. Typeable a effectivement le type forall k. k -> Constraint, ce qui signifie qu'il est polykinded. Dans le premier extrait ci-dessous, l'argument * à Typeable instancie k avec *, car la variable de type a a le type *.

Alors oui, comme vous l'avez deviné, il s'agit de PolyKinds. Haddock rend ces types poly-aimés avec une sorte d '"application explicite". Il se trouve juste que Category est poly-kinded, ayant le type forall k. (k -> k -> *) -> Constraint, donc Haddock rend l'application de type à côté de chaque instance. À mon avis, c'est un bug ou un défaut de Haddock, puisqu'il n'y a pas de code source équivalent analogique pour autant que je sache. C'est déroutant, et je ne connais pas de meilleure façon de le comprendre que de reconnaître la façon dont il se manifeste habituellement et de déduire visuellement ce qui se passe dans le contexte.

+2

D'accord, je considère également cela comme un bug. Peut-être que l'utilisation de 'Category @k (Coercion k)' serait une meilleure notation. – chi

+0

Il existe des cas où il doit spécifier le type de variables de type qui ne sont pas présentes dans le type. Cette combinaison rend vraiment difficile de trouver une façon saine de documenter. – Carl