Что означает * (звездочка) или другие виды в списке экземпляров пикши

Просматривая кучу различных пакетов, я часто натыкаюсь на документацию экземпляров, которая выглядит примерно так (Control.Category):

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

или это (Control.Monad.Trans .Идентификация):

MonadTrans (IdentityT *)

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

Итак, мои вопросы:

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

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


person Julia Path    schedule 21.01.2017    source источник


Ответы (1)


Процитировать недавнее сообщение Ричарда Айзенберга в списке рассылки haskell-cafe:

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

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

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

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

person Alexis King    schedule 21.01.2017
comment
Согласен, я тоже считаю это ошибкой. Возможно, использование Category @k (Coercion k) было бы лучшим обозначением. - person chi; 21.01.2017
comment
Бывают случаи, когда необходимо указать тип переменных типа, которых нет в типе. Из-за этой комбинации очень сложно найти разумный способ документирования. - person Carl; 21.01.2017