我不熟悉GHC内部,但我对ConstraintKinds有几个问题。
它从GHC.Exts
上说
data Constraint :: BOX
这是误导性的,因为CCD_。这就引出了第一个问题:我们可以进口和出口种类吗?这是怎么回事?
如果我完全不满意,请在下一部分更正我。通过尝试不同的导入并浏览hackage上的源代码,我猜测GHC.Exts
从GHC.Base
导入Constraint
,而CCD_6又从GHC.Prim
导入。但我看不出GHC.Prim
在哪里定义了它?
据我所知,在任何Haskell源文件中都没有Constraint
的定义。它是一个内置的有线名称,被定义为属于GHC源本身的GHC.Prim
。因此,特别是Constraint
不是一个提升的数据类型,也没有对应的*
类型的数据类型被称为Constraint
。
GHC中还有其他种类也受到类似的处理,例如AnyK
、OpenKind
甚至BOX
本身。
GHC在内部并没有对数据类型和种类以及以上任何东西产生太大的区别。这就是为什么它们都显示为使用data
定义的,尽管目标种类不同。
请注意,就GHC而言,我们也有
data BOX :: BOX
不过,用户不可能直接定义超类BOX
的新"种类"。
据我所知,导入/导出在类型和种类名称空间之间也没有区别。因此,例如
import GHC.Exts (OpenKind, BOX, Constraint)
是合法的。事实上,如果你说
x :: Constraint
x = undefined
您不会得到范围错误,而是一个种类错误,表示需要*
的类型,但提供了Constraint
0的类型/种类。
我也许还应该说,关于种类的整个故事在某种程度上是不断变化的,有一些建议正在讨论中,可以稍微改变这一点:参见例如。https://ghc.haskell.org/trac/ghc/wiki/NoSubKinds以供相关讨论。