约束类型在哪里定义?

时间:2015-04-10 14:45:39

标签: haskell ghc constraint-kinds

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

GHC.Exts

data Constraint :: BOX

这会产生误导,因为Constraint是一种排序BOX。这给我们带来了第一个问题:我们可以进口和出口种类吗?这有什么作用?

如果我完全离开,请在下一部分纠正我。通过尝试不同的导入并在源头上浏览hackage,我的猜测是GHC.ExtsConstraint导入GHC.BaseGHC.Prim反过来从{{1}}导入它。但我看不到GHC.Prim中的定义位置?

1 个答案:

答案 0 :(得分:7)

据我所知,在任何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

您没有收到范围错误,但是出现了类似错误,说明需要类型*,但提供的类型/种类BOX

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

相关问题