Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 约束类型在哪里定义?_Haskell_Ghc_Constraint Kinds - Fatal编程技术网

Haskell 约束类型在哪里定义?

Haskell 约束类型在哪里定义?,haskell,ghc,constraint-kinds,Haskell,Ghc,Constraint Kinds,我不熟悉GHC的内部结构,但我有几个关于约束类型的问题 上面说 这是一种误导,因为Constraint是一种排序BOX。这就引出了第一个问题:我们可以进口和出口各种商品吗?这是怎么回事 如果我完全离开了,请在下一部分纠正我。通过尝试不同的导入和浏览hackage上的源代码,我猜GHC.Exts从GHC.Base导入Constraint,然后从GHC.Prim导入。但我看不出它在哪里定义?据我所知,在任何Haskell源文件中都没有约束的定义。它是一个内置的有线名称,定义为属于GHC源本身的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