@@ -70,6 +70,30 @@ actuallyUnify variable1 variable2 = do
7070 }
7171 TS.register var
7272
73+ flexAndUnify var = do
74+ liftIO $ UF.modifyDescriptor var $ \desc -> desc { flex = Flexible }
75+ unify variable1 variable2
76+
77+ superUnify =
78+ case (flex desc1, flex desc2, name desc1, name desc2) of
79+ (IsIn Number, IsIn Number, _, _) -> merge
80+ (IsIn Number, IsIn Comparable, _, _) -> merge1
81+ (IsIn Comparable, IsIn Number, _, _) -> merge2
82+
83+ (IsIn Number, _, _, Just name)
84+ | name == "Int" || name == "Float" -> flexAndUnify variable1
85+
86+ (_, IsIn Number, Just name, _)
87+ | name == "Int" || name == "Float" -> flexAndUnify variable2
88+
89+ (IsIn Comparable, _, _, Just name)
90+ | name == "Int" || name == "Float" -> flexAndUnify variable1
91+
92+ (_, IsIn Comparable, Just name, _)
93+ | name == "Int" || name == "Float" -> flexAndUnify variable2
94+
95+ _ -> TS.addError "The following types are not equal" variable1 variable2
96+
7397 case (structure desc1, structure desc2) of
7498 (Nothing, Nothing) | flex desc1 == Flexible && flex desc1 == Flexible -> merge
7599 (Nothing, _) | flex desc1 == Flexible -> merge2
@@ -78,8 +102,8 @@ actuallyUnify variable1 variable2 = do
78102 (Just (Var1 v), _) -> unify v variable2
79103 (_, Just (Var1 v)) -> unify v variable1
80104
81− (Nothing, _) -> TS.addError "The following types are not equal" variable1 variable2
82− (_, Nothing) -> TS.addError "The following types are not equal" variable1 variable2
105+ (Nothing, _) -> superUnify
106+ (_, Nothing) -> superUnify
83107
84108 (Just type1, Just type2) ->
85109 case (type1,type2) of
@@ -98,4 +122,5 @@ actuallyUnify variable1 variable2 = do
98122 (Record1 fields1 ext1, Record1 fields2 ext2) ->
99123 TS.addError "did not write record unification yet" variable1 variable2
100124
101− _ -> TS.addError "could not unify types" variable1 variable2
125+ _ -> TS.addError "could not unify types" variable1 variable2
126+