依赖类型是否给您所有子类型化功能?


24

类型和编程语言将重点放在子类型上,但是据我所知,子类型似乎并不是特别基础。与依赖类型相比,子类型化还给您更多的好处吗?使用依赖类型必然会花费更多工作,因此我可以理解为什么子类型在实践中可能会有用。但是,我对类型理论作为数学的基础比对编程语言的基础更感兴趣,我应该特别注意子类型化吗?

Answers:


22

子类型和从属类型是正交的概念。

子类型化通常配备了包含的概念,因此一种类型的表达可以出现在期望超类型的地方。

子类型化更容易决定,在实现中更易于管理。

依赖类型更具表现力。但是,如果您想将一个组也视为一个monoid,那么您需要一个包含的概念来忘记额外的结构。通常,例如在使用Coq时,会产生琐碎的证明义务来应对这种强制性,因此在实践中,子类型化可能不会添加任何内容。更重要的是要有将各种理论打包在一起以使其可重用的方法,例如在谈论群体时重用monoid的理论。Coq中的类型类是执行此类操作的最新创新。模块是一种较旧的方法。

如果您快速浏览一下“对子类型进行子类型化”,您会发现很多工作都在为子类型添加子类型,主要是在2000年左右。我认为元理论确实具有挑战性,因此在子类型中不会出现子类型化证明助手。


3
谢谢,这正是我想要的。我现在问了几个新手问题,尽管cstheory.SE似乎不是解决这些问题的合适地点,但似乎有些受到欢迎。在-5到+5的范围内,您将来会鼓励还是不鼓励类似的问题?顺便提一下,据我了解(从阅读Robert Harper的文章中),类型类是模块的子类,对吗?
约翰·萨尔瓦

3
这个问题位于适合cstheory.SE的边界的右端。类型类实际上不是模块的子类。它更像是类型类是模块+类型推断+ free_plumbing。
戴夫·克拉克

2
我想您总是可以很容易地对依赖类型的子类型进行建模/模拟。在Haskell中,HList(仅基于可确定的类型相等性构建)为您提供了子类型化(例如,参见“ Haskell的被忽略对象系统”)。关于子类型化的唯一困难部分是类型推断,一旦使用从属类型,无论如何都要扔掉其中的90%。
sclv 2011年

(从评论更改为答案)
Neel Krishnaswami

马丁·洛夫类型理论的子集理论基本上是对结构遗忘进行建模所需要的,其历史可以追溯到1980年代。我认为这是@Neel在回答中所遇到的问题。
查尔斯·斯图尔特

22

但是,我对类型理论作为数学的基础比对编程语言的基础更感兴趣,我应该特别注意子类型化吗?

子类型化为您提供的另一件事情是,子类化意味着拥有许多一致性属性。从属类型理论还需要证明无关紧要的概念来对子类型可以做的所有事情建模。例如,在从属类型理论中,您可以近似形成具有从属记录的子集:

{xS|;P(x)} vs. Σx:S.P(x)

SP(x)x:

X<:Yx:Xx:YP(x)P(x)

一旦有了这些,就可以系统地将子类型化为从属类型理论。有关在依赖类型理论中添加子类型的示例(在本例中为Twelf),请参见William Lovas的论文。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.