@Override public TypeResult typecheck(TypeEnv E) throws TypeError { Logger.i("----------type check in App"); TypeResult tr1 = l.typecheck(E); Logger.i("e1:" + tr1.t); TypeResult tr2 = r.typecheck(E); Logger.i("e2:" + tr2.t); Type t1 = tr1.t; Type t2 = tr2.t; Substitution substitution = tr2.s.compose(tr1.s); t1 = substitution.apply(t1); t2 = substitution.apply(t2); Type resultType; if (t1 instanceof ArrowType) { substitution = ((ArrowType) t1).t1.unify(t2).compose(substitution); // t1=t2->a t1 = substitution.apply(t1); resultType = ((ArrowType) t1).t2; } else if (t1 instanceof TypeVar) { TypeVar tv = new TypeVar(false); // new type a substitution = t1.unify(new ArrowType(t2, tv)).compose(substitution); resultType = substitution.apply(tv); } else { throw new TypeError("no function found"); } Logger.i("----------end check in App"); return TypeResult.of(substitution, resultType); // return a }
@Override public TypeResult typecheck(TypeEnv E) throws TypeError { TypeResult l_type = l.typecheck(E); Substitution sub = l_type.s; sub = sub.apply(l_type.t).unify(Type.BOOL).compose(sub); TypeResult r_type = r.typecheck(sub.compose(E)); sub = r_type.s.compose(sub); sub = sub.apply(r_type.t).unify(Type.BOOL).compose(sub); return TypeResult.of(sub, Type.BOOL); }