Γ(x) = ∀α. α → α
unify(α, T) = {α ↦ T} if α ∉ freevars(T)
W(Γ, e1 e2): S1,t1 = W(Γ,e1); S2,t2 = W(S1Γ,e2); α fresh; S3 = unify(S2t1, t2 → α); return S3∘S2∘S1, S3α
generalize(Γ, T) = ∀(freevars(T) − freevars(Γ)). T
Subst = Map; apply(Subst, Type), compose(Subst, Subst)