在工作中,我的任务是推断一些有关动态语言的类型信息。我将语句序列重写为嵌套let
表达式,如下所示:
return x; Z => x
var x; Z => let x = undefined in Z
x = y; Z => let x = y in Z
if x then T else F; Z => if x then { T; Z } else { F; Z }
由于我从一般类型信息开始,并试图推断出更具体的类型,因此自然的选择是精简类型。例如,条件运算符返回其真假分支类型的并集。在简单的情况下,它效果很好。
但是,在尝试推断以下类型时遇到了障碍:
function g(f) {
var x;
x = f(3);
return f(x);
}
改写为:
\f.
let x = undefined in
let x = f 3 in
f x
HM会推断并因此。我想能够推断出的实际类型是:
我已经使用函数依赖,解决超载的类型+
操作,所以我想这是一个自然的选择使用它们来解决的类型f
之内g
。也就是说,f
在其所有应用程序中的类型共同唯一地确定的类型g
。然而,事实证明,眼底不适适应可变数量的源类型。
无论如何,多态与精炼类型的相互作用是有问题的。那么,有没有一种更好的方法我不见了?我目前正在消化“ ML精炼类型”,希望能有更多文献或其他指导。