约束类型在哪里定义



我不熟悉GHC内部,但我对ConstraintKinds有几个问题。

它从GHC.Exts上说

data Constraint :: BOX

这是误导性的,因为CCD_。这就引出了第一个问题:我们可以进口和出口种类吗?这是怎么回事?

如果我完全不满意,请在下一部分更正我。通过尝试不同的导入并浏览hackage上的源代码,我猜测GHC.ExtsGHC.Base导入Constraint,而CCD_6又从GHC.Prim导入。但我看不出GHC.Prim在哪里定义了它?

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

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

GHC在内部并没有对数据类型和种类以及以上任何东西产生太大的区别。这就是为什么它们都显示为使用data定义的,尽管目标种类不同。

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

data BOX :: BOX

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

据我所知,导入/导出在类型和种类名称空间之间也没有区别。因此,例如

import GHC.Exts (OpenKind, BOX, Constraint)

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

x :: Constraint
x = undefined

您不会得到范围错误,而是一个种类错误,表示需要*的类型,但提供了Constraint0的类型/种类。

我也许还应该说,关于种类的整个故事在某种程度上是不断变化的,有一些建议正在讨论中,可以稍微改变这一点:参见例如。https://ghc.haskell.org/trac/ghc/wiki/NoSubKinds以供相关讨论。

最新更新