2015-04-10 3 views
4

Я не знаком с внутренними компонентами GHC, но у меня есть пара вопросов о ConstraintKinds.Где определяется тип ограничения?

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

data Constraint :: BOX 

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

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

+1

'GHC.Prim' является чисто фиктивным в любом случае. Основываясь на комментариях в 'GHC.Base', кажется, что его интерфейс был однажды определен в' GHC.Prim.hi-boot', но этот файл больше не существует. – dfeuer

+0

Я нашел [более старую версию] (https://hackage.haskell.org/package/ghc-prim-0.4.0.0/docs/src/GHC-Prim.html). Но, как вы сказали, это уже не так в нынешней главе. – gspindles

+0

Эта «старая версия», которую вы нашли, на самом деле недавно, и так же, как подделка. Как показывают комментарии, он используется только Haddock и никогда не компилируется. – dfeuer

ответ

7

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

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

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

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

data BOX :: BOX 

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

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

import GHC.Exts (OpenKind, BOX, Constraint) 

является законным. В самом деле, если вы потом сказать

x :: Constraint 
x = undefined 

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

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

+1

На днях мы обнаружили тонкую разницу, которая, возможно, является ошибкой: если вы попытаетесь * повторно экспортировать * с помощью модуля ...(модуль GHC.Exts) 'или' (модуль GHC.Prim) ', тип' Constraìnt' будет таинственным образом исключен. Вы должны явно указывать его в списках экспорта, так как сам GHC.Exts. (Кстати, вы можете на самом деле ': i (GHC.Prim. *)', Хотя, по-видимому, невозможно фактически использовать * '*' таким образом.) –

Смежные вопросы