我只是开始熟悉种类的概念,所以如果我不能很好地提出我的问题,请耐心等待......
值包含类型:
3 :: Int
[1,2,3] :: [Int]
('c',True) :: (Char,Bool)
类型有种类:
the type 'Int' has kind *
the type '[Int]' also has kind *
but the type constructor [] has kind * -> *
similarly, the type (Char,Bool) has kind *
but the type constructor (,) has kind * -> * -> *
Kinds有什么作用?
他们有种类型,种类,品种或品种吗?
这个抽象序列到底有多远?我们是否会停止,因为我们没有语言,或者我们是否因为更远没有价值而停止?或者,也许是因为我们很快就达到了人类认知的极限,而且无法将我们的头脑包裹在更高级别的种类中?
一个相关的问题:语言为我们提供了值构造函数(如cons运算符)来创建值。语言还为我们提供了类型构造函数,如(,)或[]来创建类型。是否有任何语言暴露出类型构造函数来制作类型?
我很好奇的另一个边缘情况:我们显然有一个没有值的类型,表示为⊥,称为“底部类型”。有没有类型的东西:底层种类?
答案 0 :(得分:30)
术语type
和kind
无法很好地扩展。键入理论家,因为Bertrand Russell使用了“类型”的层次结构。其中一个版本有Integer : Type 0, Type 0 : Type 1, Type 1 : Type 2, ..., Type n : Type (n+1), ....
在依赖类型的语言中,如Coq和Agda,人们经常需要这些“更高级别的”。
这样的级别有助于避免Russell's paradox。使用Type : Type
往往会导致矛盾(有关替代设计,请参阅Quine)。
当我们需要时,这种数字的使用是标准符号。某些类型理论有“累积类型”,“累积级别”或“累积排序”的概念,其中说“如果t : Type n
,那么t : Type (n+1)
”。
累积级别+“级别多态性”给出的理论几乎和Type : Type
一样灵活,但避免了悖论。虽然排序Set
和Prop
都是Type
,Type {1} : Type {2}
,但Coq主要隐含级别。也就是说,您通常不会看到数字,而且大部分时间它都可以正常工作。
Agda有一个语言编译指示,提供级别多态性,并使事情非常灵活,但可能有点官僚主义(然而,Agda通常不像其他领域的Coq那样“官僚”)。
另一个好词是“宇宙”。
答案 1 :(得分:6)
你应该阅读Tim Sheard的关于Omega的论文,这是一种Haskell的方言,有一个类型/种类/种类的无限塔,但没有完全依赖的类型。它解释了为什么你想要这个,并提到“排序”以上的水平在实践中(至少到目前为止)并没有直接使用。