我对GHC内部不熟悉,但我对ConstraintKinds有几个问题。
从GHC.Exts
说
data Constraint :: BOX
这会产生误导,因为Constraint
是一种排序BOX
。这给我们带来了第一个问题:我们可以进口和出口种类吗?这有什么作用?
如果我完全离开,请在下一部分纠正我。通过尝试不同的导入并在源头上浏览hackage,我的猜测是GHC.Exts
从Constraint
导入GHC.Base
,GHC.Prim
反过来从{{1}}导入它。但我看不到GHC.Prim
中的定义位置?
答案 0 :(得分:7)
据我所知,在任何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
您没有收到范围错误,但是出现了类似错误,说明需要类型*
,但提供的类型/种类BOX
。
我或许也应该说,关于种类的整个故事有些不断变化,并且正在讨论的提案会改变这一点:例如, https://ghc.haskell.org/trac/ghc/wiki/NoSubKinds进行相关讨论。