+instance == Type
+where
+ (==) (TyBasic a1) (TyBasic a2) = a1 == a2
+ (==) (TyArrow l1 r1) (TyArrow l2 r2) = l1 == l2 && r1 == r2
+ (==) (TyArray s1 a1) (TyArray s2 a2) = s1 == s2 && a1 == a2
+ (==) (TyUList s1 a1) (TyUList s2 a2) = s1 == s2 && a1 == a2
+ (==) (TyNewType i1 j1 a1) (TyNewType i2 j2 a2)
+ = i1.gtd_name == i2.gtd_name && a1 == a2
+ (==) (TyObject i1 a1) (TyObject i2 a2)
+ = i1.gtd_name == i2.gtd_name && length a1 == length a2
+ && and [l1.gcd_name == l2.gcd_name && t1 == t2\\(l1, t1)<-a1 & (l2, t2)<-a2]
+ (==) (TyRecord i1 a1) (TyRecord i2 a2)
+ = i1.grd_name == i2.grd_name && length a1 == length a2
+ && and [l1.gfd_name == l2.gfd_name && t1 == t2\\(l1, t1)<-a1 & (l2, t2)<-a2]
+ (==) _ _ = False
+
+predef :: [(String, String)]
+predef =:
+ [("_List", "[]"), ("_!List", "[! ]"), ("_List!", "[ !]"), ("_!List!", "[!!]")
+ ,("_#List", "[#]"), ("_#List!", "[#!]")
+ ,("_Array", "{}"), ("_!Array", "{!}"), ("_#Array", "{#}")
+ :[("_Tuple" +++ toString i, "(" +++ createArray i ',' +++")")\\i<-[2..32]]]
+
+translateType :: String -> String
+translateType s = maybe s id $ lookup s predef
+