约束类型在哪里定义?

Where is the Constraint kind defined?

我不熟悉 GHC 内部结构,但我有几个关于 ConstraintKinds 的问题。

它说 GHC.Exts

data Constraint :: BOX

这是一种误导,因为 Constraint 是一种 BOX。这给我们带来了第一个问题:我们可以导入和导出种类吗?它是如何工作的?

如果我完全不对,请在下一部分中纠正我。通过尝试不同的导入并浏览 hackage 的源代码,我的猜测是 GHC.ExtsGHC.Base 导入 Constraint,后者又从 GHC.Prim 导入它。但是我没有看到它在 GHC.Prim?

中定义的位置

据我所知,在任何 Haskell 源文件中都没有 Constraint 的定义。它是一个内置的、有线输入的名称,定义为属于 GHC 源本身的 GHC.Prim。所以特别是 Constraint 不是提升的数据类型,没有相应的数据类型 * 被称为 Constraint.

GHC 中还有其他种类也有类似的处理方式,例如 AnyKOpenKind 甚至 BOX 本身。

GHC 在数据类型和种类以及以上任何内容之间并没有真正在内部产生很大的区别。这就是为什么他们所有显示为使用 data 定义,尽管目标种类不同。

请注意,就 GHC 而言,我们还有

data BOX :: BOX

不过,用户不可能直接定义超类BOX的新"kinds"。

据我所知,导入/导出在 type 和 kind 命名空间之间也没有区别。所以例如

import GHC.Exts (OpenKind, BOX, Constraint)

是合法的。事实上,如果你接着说

x :: Constraint
x = undefined

你没有得到一个范围错误,而是一个种类错误,说需要一个种类 *,但是提供了一个种类 BOX 的 type/kind。

我或许还应该说,关于种类的整个故事都在不断变化,并且正在讨论一些改变这一点的提议:参见例如https://ghc.haskell.org/trac/ghc/wiki/NoSubKinds 进行相关讨论。