可确定推断的最强大的已知类型系统是什么?


22

众所周知,Hindley-Milner类型推断(具有多态性的简单类型的演算)具有可确定的类型推断:您可以为任何程序重建原理类型而无需任何注释。λ

添加哈斯克尔风格类型类似乎保留此可判定性,但进一步增加使得推理没有标注不可判定的(类型的家庭,GADTs,依赖类型,等级-N类型,系统等)ω

我想知道:最能断定推断的已知类型系统是什么?它会介于Hindley-Milner(完全可确定)和依赖类型(完全不可确定)之间。是否可以添加DT的某些方面来保持推理可判定性?已经进行了哪些研究以了解可以将其推进多远?

我意识到,没有一个最强大的系统,可能有无限的微小增量变化可以添加到HM保持推理中。但是可能已经发现了一些实用的系统候选对象。

编辑:因为没有“最强”的系统,我会接受,勾勒出一个答案显着扩展辛德雷米尔纳与可判定的推理系统。例如液体类型,等级2等。


4
@jmite我同意这里的其他人。确实没有已知的明确边界。我怀疑会不会。可判定性类型推断实际上取决于所有语言功能,例如您是否获得子类型化。在我们知道的具有较高排序类型的HM扩展中可以找到一个明确的边界:对于等级k> 2,类型推断是不可确定的,否则它是可确定的。
Martin Berger

@MartinBerger我接受没有最强的东西,但是我认为要概述著名的东西,比如您提到的Rank-2,仍然有一个很好的答案。
jmite

1
@jmite拥有一个关于类型推断的可判定性纲要太好了。没有这样的东西,所有这些都散布在约100份论文中。也许您可以编写一个,这对社区来说将是一项很棒的服务。
马丁·伯杰

在我看来,写出该问题的答案可能很困难,但是对于提问者来说,迪迪埃·雷米(DidierRémy)(及其参考文献)最近进行的类型推断工作无疑是很有趣的。
ejgallego '16

Answers:


2

[编辑:Voilà每句话几句话]

有几种扩展HM类型推断的方法。我的回答是基于许多成功或多或少成功的尝试来实现的。我偶然发现的第一个参数多态性。试图在此方向上扩展HM的类型系统倾向于系统F,因此需要类型注释。我遇到的这个方向的两个值得注意的扩展是:

  • HMF,它允许对所有System-F类型进行类型推断,这意味着您可以在类型的“中间”进行通用量化,其外观不像HM多态类型那样隐式地位于最高范围内。该文件明确指出,关于可能需要多少个类型注释以及在何处需要类型注释,没有明确的规则。同样,类型是系统F的类型,术语通常没有主体类型。

  • MLF不仅是HM的扩展,还是System F的扩展,它通过引入一种对类型的有界量化来重新获得HM的主类型属性。作者进行了比较,MLF严格比HMF强大,并且注释仅对于多态使用的参数是必需的。

扩展HM的另一种方法是通过更改约束域。

  • HM(X)是在约束域X上参数化的Hindley-Milner。在这种方法中,HM算法生成发送到X的域求解器的约束。对于通常的HM,域求解器是统一过程,并且域由根据类型和类型变量构建一组术语。
    X的另一个示例可以是用Presburger算术语言(这种情况下类型推断/检查是可确定的)或Peano算术语言(不再可确定)表达的约束。X沿各种理论变化,每种理论对类型注释的数量和位置都有自己的要求,范围从根本到全部。

  • Haskell的类型类也是约束域的一种扩展,它通过添加形式的类型谓词MyClass(MyType)(这意味着存在MyType类型的实例MyClass)。
    类型类保留类型推断,因为它们基本上是(几乎)正交的概念,它们实现了即席多态性
    举个例子,拿一个可以有实例val的类型符号,等等。在代码中引用该符号时,实际上是因为已经执行了类型推断,编译器才可以推断要使用哪个类实例。这意味着,依赖的类型取决于使用它的上下文。这就是为什么运行单个语句会导致val :: MyClass a => aMyClass AMyClass Bvalvalambiguous type error :编译器无法根据上下文推断任何类型。

对于更高级的类型系统,如GADT,类型族,从属类型,系统(F)ω等,类型不再是“类型”,它们成为复杂的计算对象。例如,这意味着看起来不同的两种类型不一定是不同的。因此,类型相等性变得不平凡。

为了给您一个实际复杂度的例子,让我们考虑list的依赖类型:NList a nwhere a是列表中对象的类型,n它是长度。
append函数的类型为append :: NList a n -> NList a m -> NList a (n + m),而zip函数的类型为zip :: NList a n -> NList b n -> NList (a, b) n
想象现在我们有了lambda \a: NList t n, b: NList t m -> zip (append a b) (append b a)。这里zip的第一个参数是type NList t (n + m),第二个参数是type NList t (m + n)
几乎相同,但是除非类型检查器知道“ +”在自然数上换位,否则它必须拒绝该函数,因为(n + m)并非字面意义(m + n)。它不再与类型推断/类型检查有关,而与定理证明有关。

液体类型似乎在进行一些从属类型推断。但是据我了解,它并不是真正的依赖类型,更像是普通的HM类型,可以对其进行额外推断以计算静态范围。

我希望这有帮助。

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.