2017-01-21 2 views
5

, просматривающих пикшу различных пакетов, которые я часто прихожу вместе экземпляр документаций, которые выглядят так (Control.Category):Что * (звезда) или другие виды означают в списке экземпляров пикша

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

или этого (Control.Monad.Trans.Identity):

MonadTrans (IdentityT *) 

Что именно здесь означает подпись вида? Он не отображается в исходном коде, но я уже заметил, что это происходит в модулях, которые используют расширение PolyKinds. Я подозреваю, что это похоже на TypeApplication, но с видом. Так, например, последний пример означает, что IdentityT является монадным трансформатором, если его первый аргумент имеет вид *.

Так что мои вопросы:

  • ли моя интерпретация правильно и что именно делает вид подписи относится?
  • В первом экземпляре Category, как я должен знать, что k - это вид, а не тип? Или мне просто нужно знать арность Category?
  • Каков исходный код, аналогичный этому синтаксису?

Я не прошу объяснения видов.

ответ

4

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

пикша борется иногда делают тип с -XPolyKinds включено. Проблема в том, что GHC обычно не требует, чтобы были написаны добрые аргументы, и они не распечатывают их (если вы не скажете -fprint-explicit-kinds). Но, как я считаю, Haddock печатает виды, когда -XPolyKinds включен. Таким образом, два разных определения действительно одинаковы: просто один модуль имеет -XPolyKinds, а другой нет.

* - вид обычных типов. Таким образом, Int имеет вид * (мы пишем Int :: *), а Maybe имеет вид * -> *. Typeable действительно имеет вид forall k. k -> Constraint, что означает, что он полируется. В первом фрагменте ниже аргумент * для Typeable создает экземпляр k с *, так как переменная типа a имеет вид *.

Да, как вы уже догадались, это связано с PolyKinds. Haddock отображает эти многоподобные типы с своего рода «явным видом приложения». Так получилось, что Category является полиподобным, имеющим вид forall k. (k -> k -> *) -> Constraint, поэтому Haddock отображает приложение вида рядом с каждым экземпляром.

На мой взгляд, это ошибка или неточность Хэддока, поскольку, насколько мне известно, аналога исходного кода нет. Это сбивает с толку, и я не знаю лучшего способа понять это, чем признать способ, которым он обычно проявляется, и визуально выводить то, что происходит из контекста.

+2

Согласен, я также считаю это ошибкой. Возможно, использование 'Category @k (Coercion k)' было бы лучшей нотации. – chi

+0

Бывают случаи, когда необходимо указать тип переменных типа, отсутствующих в типе. Эта комбинация действительно затрудняет поиск разумного способа документировать. – Carl