高级类型超出了基本的 Hindley-Milner 类型系统,但可以以相同的方式处理它们。
非常粗略地,HM 解析表达式的语法树,将一个自由类型变量与每个子表达式相关联,并根据类型规则在涉及类型变量的类型项上生成一组等式约束。使用更高的种类也可以做到这一点。
然后,通过统一解决约束。统一算法中的一个典型步骤是(伪haskell如下)
(F t1 ... tn := G s1 ... sk) =
| n/=k || F/=G -> fail
| otherwise -> { t1 := s1 , ... , tn := sn }
(请注意,这只是统一算法的一部分。)
以上F
,G
是类型构造函数符号,而不是变量。在更高种类的统一中,我们需要考虑F
,G
也是变量。我们可以尝试以下规则:
(f t1 ... tn := g s1 ... sk) =
| n/=k -> fail
| otherwise -> { f := g , t1 := s1 , ... , tn := sn }
可是等等!以上是不正确的,因为 egf Int ~ Either Bool Int
必须统一 when f ~ Either Bool
。所以,我们还需要考虑 的情况n/=k
。一般来说,一个简单的规则集是
(f t := g s) =
{ f := g , t := s }
(F := G) = -- rule for atomic terms
| F /= G -> fail
| otherwise -> {}
(同样,这只是统一算法的一部分。其他情况也必须处理,正如 Andreas Rossberg 在下面指出的那样。)