@@ -245,16 +245,16 @@ equalTypesRelatedCoeffectsInner s rel (Borrow p1 t1) (Borrow p2 t2) _ sp Types =
245245 u <- combineSubstitutions s unif unif'
246246 return (eq && eq', u)
247247
248+ -- Handle equality involving renaming
249+ equalTypesRelatedCoeffectsInner s rel
250+ t0@ (TyApp (TyApp (TyApp (TyCon (internalName -> " Rename" )) (TyVar oldName)) (TyVar newName)) t) t' ind sp mode = do
251+ debugM " RenameL" (pretty t0 <> " = " <> pretty t')
252+ eqRenameFunction s rel oldName newName t t' sp
248253
249- equalTypesRelatedCoeffectsInner s rel t0@ (TyApp (TyApp (TyCon d) name) t) t' ind sp mode
250- | internalName d == " Rename" = do
251- debugM " RenameL" (pretty t <> " = " <> pretty t')
252- eqRenameFunction s rel name t t' sp
253-
254- equalTypesRelatedCoeffectsInner s rel t' t0@ (TyApp (TyApp (TyCon d) name) t) ind sp mode
255- | internalName d == " Rename" = do
256- debugM " RenameR" (pretty t <> " = " <> pretty t')
257- eqRenameFunction s rel name t t' sp
254+ equalTypesRelatedCoeffectsInner s rel t'
255+ t0@ (TyApp (TyApp (TyApp (TyCon (internalName -> " Rename" )) (TyVar oldName)) (TyVar newName)) t) ind sp mode = do
256+ debugM " RenameR" (pretty t' <> " = " <> pretty t0)
257+ eqRenameFunction s rel oldName newName t t' sp
258258
259259-- ## GENERAL EQUALITY
260260
@@ -557,102 +557,33 @@ eqGradedProtocolFunction sp rel grad (TyVar v) t ind = do
557557eqGradedProtocolFunction sp _ grad t1 t2 _ = throw
558558 TypeError { errLoc = sp, tyExpected = (TyApp (TyApp (TyCon $ mkId " Graded" ) grad) t1), tyActual = t2 }
559559
560- -- Compute the behaviour of `Rename id a` on a type `A`
561- renameBeta :: (? globals :: Globals )
562- => Type -- name
560+ -- Compute the behaviour of `Rename oldId newId a`
561+ -- where the arguments here are `oldId`, `newId` and `a`
562+ renameBeta ::
563+ Id -- oldName
564+ -> Id -- newName
563565 -> Type -- type
564566 -> Checker Type
565- renameBeta name (TyApp (TyApp (TyCon c) t) s)
566- | internalName c == " Ref" = do
567- s' <- renameBeta name s
568- return $ (TyApp (TyApp (TyCon c) name) s')
569-
570- renameBeta name (TyApp (TyCon c) t)
571- | internalName c == " FloatArray" = do
572- return $ (TyApp (TyCon c) name)
573-
574- renameBeta name (TyApp (TyApp (TyCon c) t1) t2)
575- | internalName c == " ," = do
576- t1' <- renameBeta name t1
577- t2' <- renameBeta name t2
578- return $ (TyApp (TyApp (TyCon c) t1') t2')
579-
580- renameBeta name (Star g t) = do
581- t' <- renameBeta name t
582- return $ (Star g t')
583-
584- renameBeta name (Borrow p t) = do
585- t' <- renameBeta name t
586- return $ (Borrow p t')
587-
588- renameBeta name t = return t
589-
590- renameBetaInvert :: (? globals :: Globals )
591- => Span
592- -- Explain how coeffects should be related by a solver constraint
593- -> (Span -> Coeffect -> Coeffect -> Type -> Constraint )
594- -> Type -- name
595- -> Type -- type
596- -- Indicates whether the first type or second type is a specification
597- -> SpecIndicator
598- -- Flag to say whether this type is actually an effect or not
599- -> Mode
600- -> Checker (Type , Substitution )
601-
602- -- Ref case
603- -- i.e., Rename id a = Ref id' a'
604- -- therefore check `id ~ id'` and then recurse
605- renameBetaInvert sp rel name (TyApp (TyApp (TyCon c) name') s) spec mode
606- | internalName c == " Ref" = do
607- -- Compute equality on names
608- (_, subst) <- equalTypesRelatedCoeffects sp rel name name' spec mode
609- (s, subst') <- renameBetaInvert sp rel name s spec mode
610- substFinal <- combineSubstitutions sp subst subst'
611- return (TyApp (TyApp (TyCon c) name') s, substFinal)
612-
613- renameBetaInvert sp rel name (TyApp (TyCon c) name') spec mode
614- | internalName c == " FloatArray" = do
615- -- Compute equality on names
616- (_, subst) <- equalTypesRelatedCoeffects sp rel name name' spec mode
617- return (TyApp (TyCon c) name', subst)
618-
619- renameBetaInvert sp rel name (TyApp (TyApp (TyCon c) t1) t2) spec mode
620- | internalName c == " ," = do
621- (t1', subst1) <- renameBetaInvert sp rel name t1 spec mode
622- (t2', subst2) <- renameBetaInvert sp rel name t2 spec mode
623- substFinal <- combineSubstitutions sp subst1 subst2
624- return (TyApp (TyApp (TyCon c) t1') t2', substFinal)
625-
626- renameBetaInvert _ _ name t _ _ = return (t, [] )
567+ renameBeta oldName newName t =
568+ typeFoldM (baseTypeFold { tfTyVar = return . TyVar . renamer }) t
569+ where
570+ renamer :: Id -> Id
571+ renamer id = if id == oldName then newName else id
627572
628- -- Check if `Rename id a ~ a'` which may involve some normalisation in the
629573-- case where `a'` is a variable
630574eqRenameFunction :: (? globals :: Globals )
631575 => Span
632576 -> (Span -> Coeffect -> Coeffect -> Type -> Constraint )
633577 -- These two arguments are the arguments to `Rename id a`
634- -> Type -- name
578+ -> Id -- oldName
579+ -> Id -- newName
635580 -> Type -- type
636581 -- This is the argument of the type which we are trying to see if it equal to `Rename id a`
637582 -> Type -- compared against
638583 -> SpecIndicator
639584 -> Checker (Bool , Substitution )
640-
641- eqRenameFunction sp rel name t (TyApp (TyApp (TyCon d) name') t') ind
642- | internalName d == " Rename" = do
643- (_, subst) <- equalTypesRelatedCoeffects sp rel name name' ind Types
644- (eq, subst') <- eqRenameFunction sp rel name t t' ind
645- substFinal <- combineSubstitutions sp subst subst'
646- return (eq, substFinal)
647-
648- eqRenameFunction sp rel name (TyVar v) t ind = do
649- (t', subst) <- renameBetaInvert sp rel name t ind Types
650- (eq, subst') <- equalTypesRelatedCoeffects sp rel t' (TyVar v) ind Types
651- substFinal <- combineSubstitutions sp subst subst'
652- return (eq, substFinal)
653-
654- eqRenameFunction sp rel name t t' ind = do
655- t'' <- renameBeta name t
585+ eqRenameFunction sp rel oldName newName t t' ind = do
586+ t'' <- renameBeta oldName newName t
656587 (eq, u) <- equalTypesRelatedCoeffects sp rel t'' t' ind Types
657588 return (eq, u)
658589
@@ -825,3 +756,4 @@ isPermission s ty = do
825756 putChecker
826757 return $ Right pTy
827758 Left err -> return $ Left pTy
759+
0 commit comments