@@ -170,7 +170,20 @@ actuallyUnify variable1 variable2 = do
170 cmpVars <- liftIO $ forM [1..length vs] $ \_ -> variable (Is Comparable)
170 cmpVars <- liftIO $ forM [1..length vs] $ \_ -> variable (Is Comparable)
171 zipWithM_ unifyHelp vs cmpVars
171 zipWithM_ unifyHelp vs cmpVars
173+ unifyAppendable v cvar@(Var.Canonical home name) =
176+ Var.isPrim "String" cvar
178+ || Var.isLocal (List.isPrefixOf "comparable") cvar
179+ || Var.isLocal (List.isPrefixOf "appendable") cvar
173− unifyAppendable varSuper varFlex =
186+ unifyAppendableStructure varSuper varFlex =
174 do struct <- liftIO $ collectApps varFlex
187 do struct <- liftIO $ collectApps varFlex
175 case struct of
188 case struct of
176 List _ -> flexAndUnify varSuper
189 List _ -> flexAndUnify varSuper
@@ -190,18 +203,16 @@ actuallyUnify variable1 variable2 = do
190 (Is Number, _, _, Just name) -> unifyNumber variable1 name
203 (Is Number, _, _, Just name) -> unifyNumber variable1 name
191 (_, Is Number, Just name, _) -> unifyNumber variable2 name
204 (_, Is Number, Just name, _) -> unifyNumber variable2 name
206+ (Is Appendable, _, _, Just name) -> unifyAppendable variable1 name
207+ (_, Is Appendable, Just name, _) -> unifyAppendable variable2 name
208+ (Is Appendable, _, _, _) -> unifyAppendableStructure variable1 variable2
209+ (_, Is Appendable, _, _) -> unifyAppendableStructure variable2 variable1
193 (Is Comparable, _, _, Just name) -> unifyComparable variable1 name
211 (Is Comparable, _, _, Just name) -> unifyComparable variable1 name
194 (_, Is Comparable, Just name, _) -> unifyComparable variable2 name
212 (_, Is Comparable, Just name, _) -> unifyComparable variable2 name
195 (Is Comparable, _, _, _) -> unifyComparableStructure variable1 variable2
213 (Is Comparable, _, _, _) -> unifyComparableStructure variable1 variable2
196 (_, Is Comparable, _, _) -> unifyComparableStructure variable2 variable1
214 (_, Is Comparable, _, _) -> unifyComparableStructure variable2 variable1
198− (Is Appendable, _, _, Just name)
199− | Var.isText name || Var.isPrim "String" name -> flexAndUnify variable1
200− (_, Is Appendable, Just name, _)
201− | Var.isText name || Var.isPrim "String" name -> flexAndUnify variable2
202− (Is Appendable, _, _, _) -> unifyAppendable variable1 variable2
203− (_, Is Appendable, _, _) -> unifyAppendable variable2 variable1
205 (Rigid, _, _, _) -> rigidError variable1
216 (Rigid, _, _, _) -> rigidError variable1
206 (_, Rigid, _, _) -> rigidError variable2
217 (_, Rigid, _, _) -> rigidError variable2
207 _ -> typeError variable1 variable2 Nothing
218 _ -> typeError variable1 variable2 Nothing