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 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");
* 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 {
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)