Haskell 约束类型在哪里定义?
我不熟悉GHC的内部结构,但我有几个关于约束类型的问题 上面说 这是一种误导,因为Haskell 约束类型在哪里定义?,haskell,ghc,constraint-kinds,Haskell,Ghc,Constraint Kinds,我不熟悉GHC的内部结构,但我有几个关于约束类型的问题 上面说 这是一种误导,因为Constraint是一种排序BOX。这就引出了第一个问题:我们可以进口和出口各种商品吗?这是怎么回事 如果我完全离开了,请在下一部分纠正我。通过尝试不同的导入和浏览hackage上的源代码,我猜GHC.Exts从GHC.Base导入Constraint,然后从GHC.Prim导入。但我看不出它在哪里定义?据我所知,在任何Haskell源文件中都没有约束的定义。它是一个内置的有线名称,定义为属于GHC源本身的GHC
Constraint
是一种排序BOX
。这就引出了第一个问题:我们可以进口和出口各种商品吗?这是怎么回事
如果我完全离开了,请在下一部分纠正我。通过尝试不同的导入和浏览hackage上的源代码,我猜
GHC.Exts
从GHC.Base
导入Constraint
,然后从GHC.Prim
导入。但我看不出它在哪里定义?据我所知,在任何Haskell源文件中都没有约束的定义。它是一个内置的有线名称,定义为属于GHC源本身的GHC.Prim
。因此,特别是约束
不是提升的数据类型,没有相应的*
类型的数据类型,称为约束
GHC中还有其他类似的类型,例如AnyK
、OpenKind
甚至BOX
本身
GHC在数据类型和种类以及上面的任何内容之间的内部差别并不大。这就是为什么它们都显示为使用数据定义的,尽管目标类型不同
请注意,就GHC而言,我们还有
data BOX :: BOX
但是,用户不可能直接定义超级类的新“种类”BOX
据我所知,导入/导出在类型和种类名称空间之间也没有区别。例如
import GHC.Exts (OpenKind, BOX, Constraint)
这是合法的。事实上,如果你说
x :: Constraint
x = undefined
您不会得到范围错误,而是种类错误,表示需要种类*
类型,但提供了种类框
我也许还应该说,关于种类的整个故事在某种程度上是在不断变化的,有一些建议正在讨论中,改变了这一点:参见相关讨论。前几天我们实际上发现了一个细微的差异,这可能是一个bug:如果您尝试使用模块重新导出。。。(模块GHC.Exts)
或(模块GHC.Prim)
,将神秘地排除构造类型。您必须在导出列表中明确地命名它,就像GHC.Exts
本身一样。(顺便说一句,你实际上可以:i(GHC.Prim.*)
,尽管这样使用*
似乎是不可能的。)GHC.Prim
完全是虚构的。根据GHC.Base
中的注释,它的接口似乎曾经在GHC.Prim.hi boot
中定义过,但该文件似乎不再存在了。我找到了一个。但就像你说的,现在的大脑已经不是这样了。你发现的那个“旧版本”实际上是最近的,而且是假的。正如评论所指出的,它只被Haddock使用,从未真正编译过。
x :: Constraint
x = undefined