Где определяется вид ограничения?
Я не знаком с внутренностями 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 для связанной дискуссии.,