Functional programming 自下而上的Hindley-Milner类型推断:对隐式约束应用替换
我正在尝试实现“自底向上”类型的推理算法,可以在 第6页解释了隐式约束是如何定义的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,因此当将其应用于一组类型变量时,结果将是一
t1
应该是通过对单态类型变量集M
泛化typet2
而获得的类型方案的实例
然而,在第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我最后找到了答案,并将其添加到下面