Functional programming 自下而上的Hindley-Milner类型推断:对隐式约束应用替换

Functional programming 自下而上的Hindley-Milner类型推断:对隐式约束应用替换,functional-programming,type-inference,unification,hindley-milner,Functional Programming,Type Inference,Unification,Hindley Milner,我正在尝试实现“自底向上”类型的推理算法,可以在 第6页解释了隐式约束是如何定义的 t1应该是通过对单态类型变量集M泛化typet2而获得的类型方案的实例 然而,在第9页,在解释如何对隐式约束应用替换的过程中,我被告知对这组单态类型变量应用替换。问题是如果我有替换[t1:=t2->t3],那么M不再是一组类型变量 我在这里误解了什么?我与论文的作者取得了联系,当他们告诉我答案时,我确实有点自责: 替换函数的形式为S:substitution->a->a,因此当将其应用于一组类型变量时,结果将是一

我正在尝试实现“自底向上”类型的推理算法,可以在

第6页解释了隐式约束是如何定义的

t1
应该是通过对单态类型变量集
M
泛化type
t2
而获得的类型方案的实例

然而,在第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)?

我会选择或。@Jan我最后找到了答案,并将其添加到下面