2017-01-21 30 views
5

Przeglądając haddocks różnych opakowaniach często przyjść przykład dokumentacji, które wyglądają następująco (Control.Category):Co * (gwiazdka) lub inne rodzaje myśli w liście instancji plamiaka

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

lub tym (Control.Monad.Trans.Identity):

MonadTrans (IdentityT *) 

Co dokładnie oznacza tutaj rodzaj podpisu? Nie pojawia się w źródle, ale już zauważyłem, że wydaje się, że występuje w modułach, które korzystają z rozszerzenia PolyKinds. Podejrzewam, że jest to prawdopodobnie jak TypeApplication, ale z pewnym rodzajem. Tak więc np. ostatni przykład oznacza, że ​​IdentityT jest transformatorem typu monad, jeśli jego pierwszy argument ma wartość *.

Więc moje pytania to:

  • Czy moja interpretacja poprawna i co dokładnie robi podpis rodzaj patrz?
  • W pierwszej instancji Category skąd mam wiedzieć, że k jest rodzajem, a nie typem? A może po prostu muszę znać arsenał Category?
  • Jaki jest kod źródłowy analogiczny do tej składni?

Nie proszę o wyjaśnienie rodzajów.

Odpowiedz

4

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

Haddock zmaga się czasami do renderowania typy z -XPolyKinds włączone. Problem polega na tym, że GHC generalnie nie wymaga dobrych argumentów do napisania i nie drukuje ich (chyba że powiesz -fprint-explicit-kinds). Ale Haddock, jak sądzę, drukuje rodzaje, gdy tylko jest -XPolyKinds. Tak więc dwie różne definicje są naprawdę takie same: po prostu jeden moduł ma -XPolyKinds, a drugi nie.

Typ * to rodzaj zwykłych typów. Tak więc Int ma rodzaj * (piszemy Int :: *) podczas gdy Maybe ma rodzaj * -> *. Typeable faktycznie ma rodzaj forall k. k -> Constraint, co oznacza, że ​​jest polycinded. W pierwszym opisie poniżej argument * do Typeable tworzy instancję k z *, ponieważ zmienna typu ma rodzaj *.

Tak, jak można się domyślić, ma to związek z PolyKinds. Haddock nadaje tym rodzajom poly-kinded rodzaj "jawnej aplikacji". Tak się składa, że ​​Category jest poly-kinded, mający rodzaj forall k. (k -> k -> *) -> Constraint, więc Haddock renderuje odpowiednią aplikację obok każdej instancji.

Moim zdaniem jest to błąd lub pomyłka w pląsku, ponieważ nie ma odpowiednika analogowego kodu źródłowego, o ile wiem. Jest to mylące i nie znam lepszego sposobu, aby to zrozumieć, niż rozpoznać sposób, w jaki zwykle się manifestuje i wizualnie wywnioskować, co się dzieje z kontekstu.

+2

Zgoda, uważam to za błąd. Być może użycie "Category @k (Coercion k)" byłoby lepszym zapisem. – chi

+0

Istnieją przypadki, w których należy określić rodzaj zmiennych typu, których nie ma w danym typie. Ta kombinacja sprawia, że ​​naprawdę trudno jest znaleźć rozsądny sposób dokumentowania. – Carl