public Constraints unify(Type t, List<Equation> es) throws NoType { if (t.getClass().equals(FunType.class)) { FunType f = (FunType) t; Constraints unifiedDom = domain.unify(f.domain, es); return codomain.unify(f.codomain, Assignment.asEquations(unifiedDom.assignments)); } else { return t.unifyVar(this, es); } }