Где определяется вид ограничения?

Я не знаком с внутренностями GHC, но у меня есть пара вопросов о ConstraintKinds.

Это говорит от GHC.Exts тот

data Constraint :: BOX

что вводит в заблуждение, потому что Constraint это своего рода BOX, Это подводит нас к первому вопросу: мы можем импортировать и экспортировать виды? Как это работает?

Пожалуйста, поправьте меня в этой следующей части, если я полностью выключен. Я полагаю, что от попыток различного импорта и поиска источника взлома GHC.Exts импорт Constraint от GHC.Base который, в свою очередь, импортирует его из GHC.Prim, Но я не вижу, где это определяется в GHC.Prim?

1 ответ

Решение

Насколько мне известно, нет определения Constraint в любом исходном файле на Haskell. Это встроенное проводное имя, которое определено как принадлежащее GHC.Prim в самих источниках GHC. Так в частности Constraint не является продвинутым типом данных, нет соответствующего типа данных * это называется Constraint,

В GHC есть другие виды, которые рассматриваются аналогично, такие как AnyK, OpenKind или даже BOX сам.

GHC на самом деле не имеет большого значения для внутренних типов данных и типов и для всего вышеперечисленного. Вот почему они, например, все отображаются как определяемые с помощью data хотя и с разными видами целей.

Обратите внимание, что, что касается GHC, мы также имеем

data BOX :: BOX

Пользователь не может напрямую определять новые "виды" супер-вида BOX, хоть.

Насколько я знаю, импорт / экспорт также не делает различий между пространствами имен type и kind. Так, например,

import GHC.Exts (OpenKind, BOX, Constraint)

законно На самом деле, если вы тогда говорите

x :: Constraint
x = undefined

вы не получаете ошибку области видимости, но ошибку типа, утверждая, что тип * ожидается, но тип / вид BOX предоставлен.

Возможно, мне следует также сказать, что вся история о видах находится в движении, и обсуждаются предложения, которые немного меняют это: см., Например, https://ghc.haskell.org/trac/ghc/wiki/NoSubKinds для связанной дискуссии.,

Другие вопросы по тегам