我正在尝试学习更多关于整个程序类型检查和类型推断系统的信息,这些系统使用来自函数调用站点的信息来计算类型信息(除了使用函数体的标准方法之外)。例如,这种算法可能会使用函数调用foo(1)
来推断该函数foo
采用整数参数。显然,这会使推论复杂化很多,并使检查变得非模块化。
无论如何,我没有太多运气能找到关于这种方法的研究,可能是因为我不知道描述我在说什么的正确术语。有指针吗?
我正在尝试学习更多关于整个程序类型检查和类型推断系统的信息,这些系统使用来自函数调用站点的信息来计算类型信息(除了使用函数体的标准方法之外)。例如,这种算法可能会使用函数调用foo(1)
来推断该函数foo
采用整数参数。显然,这会使推论复杂化很多,并使检查变得非模块化。
无论如何,我没有太多运气能找到关于这种方法的研究,可能是因为我不知道描述我在说什么的正确术语。有指针吗?
Answers:
几乎所有具有类型推断的系统都使用呼叫站点信息来执行此操作。示例包括标准ML,OCaml,F#和Haskell。许多其他语言使用呼叫站点信息来推断类型参数实例化,例如Java,C#,Scala和Typed Racket。这通常被称为“本地类型推断”。
我只是将您要查找的内容描述为“类型推断”,您可能应该先查找通常称为“ Hindley-Milner”系统的内容。维基百科页面给出了合理的介绍,并提供了原始论文的指导。
你可以看看类型系统交叉口类型,可以给你的东西一样a :: Int -> Int | Bool -> Bool
,所以你知道,两个专业到Int
和Bool
足够,或者使用通常的类型推理来推断出最普遍的类型,然后控制流分析,收集实际输入参数。实际上,存在混合方法(CFA表示为类型系统,反之亦然)。
关于推断最小通用类型而不是大多数通用类型的研究工作可能存在,但是我不知道它们。
至于实现多态的技术,存在两种解决方案:1)专业化(考虑C ++模板)2)统一表示假设(考虑具有void *的C样式集合)。
对于2,您在类型检查期间不需要调用站点的类型,并且可以更轻松地支持单独的编译。
请注意,我们在这里讨论参数多态,OO虚拟方法调用是完全不同的东西,称为子类型多态。请注意,C ++模板同时支持参数多态和鸭子类型(这是多态的另一种形式)。