@@ -255,21 +255,24 @@ errorMessage err = MultipleErrors [err]
255onErrorMessages :: (ErrorMessage -> ErrorMessage) -> MultipleErrors -> MultipleErrors
255onErrorMessages :: (ErrorMessage -> ErrorMessage) -> MultipleErrors -> MultipleErrors
256onErrorMessages f = MultipleErrors . map f . runMultipleErrors
256onErrorMessages f = MultipleErrors . map f . runMultipleErrors
258+-- | The various types of things which might need to be relabelled in errors messages.
259+data LabelType = TypeLabel | SkolemLabel String deriving (Show, Eq, Ord)
258-- | A map from rigid type variable name/unknown variable pairs to new variables.
261-- | A map from rigid type variable name/unknown variable pairs to new variables.
259−type UnknownMap = M.Map (Maybe String, Unknown) Unknown
262+type UnknownMap = M.Map (LabelType, Unknown) Unknown
261replaceUnknowns :: Type -> State UnknownMap Type
264replaceUnknowns :: Type -> State UnknownMap Type
262−replaceUnknowns = everywhereOnTypesM replaceUnknowns'
265+replaceUnknowns = everywhereOnTypesM replaceTypes
264− lookupTable :: (Maybe String, Unknown) -> UnknownMap -> (Unknown, UnknownMap)
267+ lookupTable :: (LabelType, Unknown) -> UnknownMap -> (Unknown, UnknownMap)
265− lookupTable x m = case M.lookup x m of
268+ lookupTable x m = case M.lookup x m of
266− Nothing -> let i = length (filter (on (==) fst x) (M.keys m)) in (i, M.insert x i m)
269+ Nothing -> let i = length (filter (on (==) fst x) (M.keys m)) in (i, M.insert x i m)
267− Just i -> (i, m)
270+ Just i -> (i, m)
269− replaceUnknowns' :: Type -> State UnknownMap Type
272+ replaceTypes :: Type -> State UnknownMap Type
270− replaceUnknowns' (TUnknown u) = state $ first TUnknown . lookupTable (Nothing, u)
273+ replaceTypes (TUnknown u) = state $ first TUnknown . lookupTable (TypeLabel, u)
271− replaceUnknowns' (Skolem name s sko) = state $ first (flip (Skolem name) sko) . lookupTable (Just name, s)
274+ replaceTypes (Skolem name s sko) = state $ first (flip (Skolem name) sko) . lookupTable (SkolemLabel name, s)
272− replaceUnknowns' other = return other
275+ replaceTypes other = return other
274onTypesInErrorMessageM :: (Applicative m) => (Type -> m Type) -> ErrorMessage -> m ErrorMessage
277onTypesInErrorMessageM :: (Applicative m) => (Type -> m Type) -> ErrorMessage -> m ErrorMessage
275onTypesInErrorMessageM f = g
278onTypesInErrorMessageM f = g