我正在尝试实现“自下而上”类型推理算法,该算法可在Generalizing Hindley-Milner Type Inference Algorithms中找到
第 6 页解释了隐式约束是如何产生的
t1
应该是类型方案的一个实例,它是通过t2
关于单态类型变量集的类型泛化获得的M
然而,在第 9 页,在解释如何对隐式约束应用替换时,有人告诉我对这组单态类型变量应用替换。问题是,如果我有替换[t1 := t2 -> t3]
,则M
不再是一组类型变量。
我在这里有什么误解?
我正在尝试实现“自下而上”类型推理算法,该算法可在Generalizing Hindley-Milner Type Inference Algorithms中找到
第 6 页解释了隐式约束是如何产生的
t1
应该是类型方案的一个实例,它是通过t2
关于单态类型变量集的类型泛化获得的M
然而,在第 9 页,在解释如何对隐式约束应用替换时,有人告诉我对这组单态类型变量应用替换。问题是,如果我有替换[t1 := t2 -> t3]
,则M
不再是一组类型变量。
我在这里有什么误解?
我与论文的作者取得了联系,当他们告诉我答案时,我确实有点自责:
替换函数具有以下形式S : Substitution -> a -> a
,因此当将其应用于一组类型变量时,结果将是一组类型变量。
因此,当应用[t1 := t2 -> t3]
而不是替换时,t2 -> t3
我替换为ftv(t2 -> t3)
aka [t2, t3]
(其中ftv
是获取类型中的自由类型变量的函数)。
如果一组单态类型变量被编码为一组单型(与裸变量名相反),那么第 9 页的 freevars(M) 中的 freevars 不需要(又一次)重载,同上替换的应用。
在这方面,SOLVE 的类型似乎有点不正确:在 activevars 的定义中,freevars 应用于 M,而在 SOLVE 中,freevars 不应用于 M(“freevars(t2) - M”),并且 M 不可能包含类型方案,即具有绑定变量。那么 M 是一组自由变量名称(无需在与其他 freevars(t) 进行集合操作之前应用 freevars)还是一组单型(需要应用 freevars)?