@@ -255,21 +255,24 @@ errorMessage err = MultipleErrors [err]
255255onErrorMessages :: (ErrorMessage -> ErrorMessage ) -> MultipleErrors -> MultipleErrors
256256onErrorMessages f = MultipleErrors . map f . runMultipleErrors
257257
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 )
260+
258261-- | 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
260263
261264replaceUnknowns :: Type -> State UnknownMap Type
262- replaceUnknowns = everywhereOnTypesM replaceUnknowns'
265+ replaceUnknowns = everywhereOnTypesM replaceTypes
263266 where
264- lookupTable :: (Maybe String , Unknown ) -> UnknownMap -> (Unknown , UnknownMap )
265- 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)
267- Just i -> (i, m)
268-
269- replaceUnknowns' :: Type -> State UnknownMap Type
270- replaceUnknowns' (TUnknown u) = state $ first TUnknown . lookupTable (Nothing , u)
271- replaceUnknowns' (Skolem name s sko) = state $ first (flip (Skolem name) sko) . lookupTable (Just name, s)
272- replaceUnknowns' other = return other
267+ lookupTable :: (LabelType , Unknown ) -> UnknownMap -> (Unknown , UnknownMap )
268+ lookupTable x m = case M. lookup x m of
269+ Nothing -> let i = length (filter (on (==) fst x) (M. keys m)) in (i, M. insert x i m)
270+ Just i -> (i, m)
271+
272+ replaceTypes :: Type -> State UnknownMap Type
273+ replaceTypes (TUnknown u) = state $ first TUnknown . lookupTable (TypeLabel , u)
274+ replaceTypes (Skolem name s sko) = state $ first (flip (Skolem name) sko) . lookupTable (SkolemLabel name, s)
275+ replaceTypes other = return other
273276
274277onTypesInErrorMessageM :: (Applicative m ) => (Type -> m Type ) -> ErrorMessage -> m ErrorMessage
275278onTypesInErrorMessageM f = g
0 commit comments