我正在尝试实现'自下而上'类型推理算法,该算法可在Generalizing Hindley-Milner Type Inference Algorithms
中找到第6页解释了隐式约束是如何
的类型
t1
应该是类型方案的一个实例,它是通过相对于单态类型变量t2
M
进行推广而获得的。
但是,在第9页,在解释如何将替换应用于隐式约束时,我被告知要对这组单态类型变量应用替换。问题是,如果我有替换[t1 := t2 -> t3]
,则M
不再是一组类型变量。
我在这里误解了什么?
答案 0 :(得分:3)
我与报纸的作者联系,当他们告诉我答案时,我确实对自己做了一些启示:
替换函数的格式为S : Substitution -> a -> a
,因此在将其应用于一组类型变量时,结果将是一组类型变量。
因此,在应用[t1 := t2 -> t3]
而非替换为t2 -> t3
时,我将ftv(t2 -> t3)
替换为[t2, t3]
(其中ftv
是获取免费类型变量的函数在一种类型)。
答案 1 :(得分:1)
如果将单态类型变量集编码为一组单纯类型(而不是裸变量名),则第9页上的freevars(M)中的freevars不需要(还有另一个)重载,同样适用于应用程序替换。
在这方面,SOLVE的输入似乎有点破坏:在activevars的定义中,freevars应用于M,而在SOLVE中,freevars不应用于M(" freevars(t2) - M") ,M可能不包含类型方案,即具有绑定变量。那么M是一个自由变量名称(不需要在使用其他freevars(t)的set操作之前应用freevars)或者它是一组monotypes(需要应用freevars)吗?