基于呼叫站点的类型推断研究?


9

我正在尝试学习更多关于整个程序类型检查和类型推断系统的信息,这些系统使用来自函数调用站点的信息来计算类型信息(除了使用函数体的标准方法之外)。例如,这种算法可能会使用函数调用foo(1)来推断该函数foo采用整数参数。显然,这会使推论复杂化很多,并使检查变得非模块化。

无论如何,我没有太多运气能找到关于这种方法的研究,可能是因为我不知道描述我在说什么的正确术语。有指针吗?


您所描述的内容具有双向类型推断的提示,除非我弄错了。但是,描述一下您要做什么。
Dominic Mulligan

您是否在问,因为您正在寻找一种专门化多态函数的方法?
nponeccop 2011年

我基本上只是想真正地了解类型系统,是的,我主要是在考虑如何处理多态函数(和OO语言中的方法调用一样)。我正在尝试为此确定正确的术语,以便我可以继续阅读。
德里克·瑟恩

Answers:


11

几乎所有具有类型推断的系统都使用呼叫站点信息来执行此操作。示例包括标准ML,OCaml,F#和Haskell。许多其他语言使用呼叫站点信息来推断类型参数实例化,例如Java,C#,Scala和Typed Racket。这通常被称为“本地类型推断”。

我只是将您要查找的内容描述为“类型推断”,您可能应该先查找通常称为“ Hindley-Milner”系统的内容。维基百科页面给出了合理的介绍,并提供了原始论文的指导。

本地类型推断的起点是Pierce和Turner的原始论文,最好在TOPLAS 2000版本(ACMPDF)中阅读。


皮尔斯和特纳的论文很有启发性,谢谢。您知道它们在代码中描述的算法的最小实现吗?我认为,如果存在的话,这也将非常有趣。
德里克·瑟恩

我不知道任何最小的实现。Typed Racket中有一个,Scala中有一个,但是两者都实现了更为复杂的算法。
山姆·托宾·霍斯塔特

0

你可以看看类型系统交叉口类型,可以给你的东西一样a :: Int -> Int | Bool -> Bool,所以你知道,两个专业到IntBool足够,或者使用通常的类型推理来推断出最普遍的类型,然后控制流分析,收集实际输入参数。实际上,存在混合方法(CFA表示为类型系统,反之亦然)。

关于推断最小通用类型而不是大多数通用类型的研究工作可能存在,但是我不知道它们。

至于实现多态的技术,存在两种解决方案:1)专业化(考虑C ++模板)2)统一表示假设(考虑具有void *的C样式集合)。

对于2,您在类型检查期间不需要调用站点的类型,并且可以更轻松地支持单独的编译。

请注意,我们在这里讨论参数多态,OO虚拟方法调用是完全不同的东西,称为子类型多态。请注意,C ++模板同时支持参数多态和鸭子类型(这是多态的另一种形式)。


1
“ OO虚拟方法调用是称为ad-hoc多态的完全不同的东西” Ad-hoc多态是超载的另一个名称。您似乎将其与子类型多态性混淆了。
Radu GRIGore

但是子类不一定是子类型,不是吗?例如,对于子类型,LSP应该成立。
nponeccop 2011年

1
没错,但是要紧。“亚型多态性”是标准术语。有关详细信息,请参见en.wikipedia.org/wiki/Subtype_polymorphism
Radu GRIGore
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.