public static final TCon VEC_COMP = con(BUILTIN, "VecComp");
public static final TCon BINDING = con(BUILTIN, "Binding");
+ public static final TCon TYPE = con(BUILTIN, "Type");
+
public static final TCon DYNAMIC = con("Prelude", "Dynamic");
public static final TCon VARIANT = con(BUILTIN, "Variant");
public static final TCon ADDITIVE = con("Prelude", "Additive");
public static final TCon MONAD = con("Prelude", "Monad");
+ public static final TCon MONAD_E = con("Prelude", "MonadE");
public static final TCon INTEGRAL = con("Prelude", "Integral");
public static final TCon RING = con("Prelude", "Ring");
public static final TCon ORDERED_RING = con("Prelude", "OrderedRing");
public static final TCon REAL = con("Prelude", "Real");
public static final TCon SHOW = con("Prelude", "Show");
- public static final TCon EQ = con("Prelude", "Eq");
public static final TCon ORD = con("Prelude", "Ord");
- public static final TCon HASHABLE = con("Prelude", "Hashable");
public static final TCon IO = con("Serialization", "IO");
public static final Type REF = con("Prelude", "Ref");
public static final TUnion NO_EFFECTS = new TUnion();
public static final TCon PROC = con(BUILTIN, "Proc");
+ public static final TCon EXCEPTION = con(BUILTIN, "Exception");
public static final TCon BRANCH_POINT = con(BUILTIN, "BranchPoint");
+
+ public static final TCon CHRContext = con(BUILTIN, "CHRContext");
+
private volatile static TCon[] tupleCache = new TCon[] {
UNIT, null
}
};
-
+
public static boolean isPrimitive(Type type) {
return type == BOOLEAN || type == BYTE || type == CHARACTER || type == SHORT ||
type == INTEGER || type == LONG || type == FLOAT || type == DOUBLE || type == STRING;
function = apply(function, parameter);
return function;
}
-
- /**
- * Get the concrete type or alias type pointed to by a chain of type meta-variables,
- * or the last metavariable in the link, if it is not linked to an actual type.
- * Unlike {@link #canonical(Type)}, this method does not resolve type aliases.
- */
- public static Type weakCanonical(Type type) {
- while(true) {
- if(type instanceof TMetaVar) {
- TMetaVar metaVar = (TMetaVar)type;
- if(metaVar.ref == null)
- return type;
- else
- type = metaVar.ref;
- }
- else
- return type;
- }
- }
/**
- * Get the concrete type pointed to by a chain of type meta-variables. Unlike {@link #weakCanonical(Type)}
- * this method also resolves type aliases.
+ * Get the concrete type pointed to by a chain of type meta-variables.
*/
public static Type canonical(Type type) {
- while(type instanceof TMetaVar) {
+ if(type instanceof TMetaVar) {
TMetaVar metaVar = (TMetaVar)type;
type = metaVar.ref;
if(type == null)
return metaVar;
+ else
+ return metaVar.ref = canonical(type);
}
return type;
}
parameters.add(Types.canonical(apply.parameter));
type = canonical(apply.function);
}
- return new MultiApply(type, parameters.toArray(new Type[parameters.size()]));
+ Type[] parametersArray;
+ if(parameters.isEmpty())
+ parametersArray = Type.EMPTY_ARRAY;
+ else {
+ parametersArray = new Type[parameters.size()];
+ for(int i=0,j=parametersArray.length-1;i<parametersArray.length;++i,--j)
+ parametersArray[i] = parameters.get(j);
+ }
+ return new MultiApply(type, parametersArray);
}
public static Type unifyApply(TCon func, Type type) throws MatchException {
}
public static void unify(Type a, Type b) throws UnificationException {
- a = weakCanonical(a);
- b = weakCanonical(b);
+ a = canonical(a);
+ b = canonical(b);
if(a == b)
return;
if(a instanceof TMetaVar) {
return result;
}
+ public static TPred[] replace(TPred[] types, TVar[] from, Type[] to) {
+ if(types.length == 0)
+ return TPred.EMPTY_ARRAY;
+ TPred[] result = new TPred[types.length];
+ for(int i=0;i<types.length;++i)
+ result[i] = (TPred)types[i].replace(from, to);
+ return result;
+ }
+
public static <T extends Type> Type[] replace(Type[] types, THashMap<TVar, T> map) {
if(types.length == 0)
return Type.EMPTY_ARRAY;
else
return new TUnion(effects);
}
+
+ public static Type union(Type effect1, Type effect2) {
+ return new TUnion(effect1, effect2);
+ }
public static Type union(List<Type> effects) {
if(effects.size() == 0)
e.getMessage()));
}
}
+
+ public static Type instantiateAndStrip(Type type) {
+ while(true) {
+ if(type instanceof TForAll) {
+ TForAll forAll = (TForAll)type;
+ type = forAll.type.replace(forAll.var, metaVar(forAll.var.getKind()));
+ }
+ else if(type instanceof TFun) {
+ TFun fun = (TFun)type;
+ if(fun.domain instanceof TPred || fun.domain == Types.PUNIT)
+ type = fun.range;
+ else
+ return type;
+ }
+ else if(type instanceof TMetaVar) {
+ TMetaVar metaVar = (TMetaVar)type;
+ if(metaVar.ref == null)
+ return type;
+ else
+ type = metaVar.ref;
+ }
+ else
+ return type;
+ }
+ }
+
}