X-Git-Url: http://git.megacz.com/?p=coq-hetmet.git;a=blobdiff_plain;f=src%2FHaskWeakTypes.v;h=593bccf77b5d2de3a138cc61f0facefea7d2dfef;hp=82cf8ad2624b44b41627f1968d7b41d6d9f2d7e9;hb=5cfd103cffd56381262b2d280cbba88e0932f78a;hpb=8c26722a1ee110077968a8a166eb7130266b2035 diff --git a/src/HaskWeakTypes.v b/src/HaskWeakTypes.v index 82cf8ad..593bccf 100644 --- a/src/HaskWeakTypes.v +++ b/src/HaskWeakTypes.v @@ -67,36 +67,13 @@ Fixpoint isTyConApp (wt:WeakType)(acc:list WeakType) : ??(TyCon * list WeakType) | _ => None end. -(* messy first-order NON-CAPTURE-AVOIDING substitution on WeakType's *) -Fixpoint replaceWeakTypeVar (te:WeakType)(tv:WeakTypeVar)(tsubst:WeakType) : WeakType := - match te with - | WTyVarTy tv' => if eqd_dec tv tv' then tsubst else te - | WAppTy t1 t2 => WAppTy (replaceWeakTypeVar t1 tv tsubst) (replaceWeakTypeVar t2 tv tsubst) - | WForAllTy tv' t => if eqd_dec tv tv' then te else WForAllTy tv' (replaceWeakTypeVar t tv tsubst) - | WCoFunTy t1 t2 t => WCoFunTy (replaceWeakTypeVar t1 tv tsubst) - (replaceWeakTypeVar t2 tv tsubst) (replaceWeakTypeVar t tv tsubst) - | WIParam ip ty => WIParam ip (replaceWeakTypeVar ty tv tsubst) - | WClassP c lt => WClassP c ((fix replaceCoreDistinctList (lt:list WeakType) := - match lt with - | nil => nil - | h::t => (replaceWeakTypeVar h tv tsubst)::(replaceCoreDistinctList t) - end) lt) - | WTyFunApp tc lt => WTyFunApp tc ((fix replaceCoreDistinctList (lt:list WeakType) := - match lt with - | nil => nil - | h::t => (replaceWeakTypeVar h tv tsubst)::(replaceCoreDistinctList t) - end) lt) - | WTyCon tc => WTyCon tc - | WFunTyCon => WFunTyCon - | WModalBoxTyCon => WModalBoxTyCon - end. - (* we try to normalize the representation of a type as much as possible before feeding it back to GHCs type-comparison function *) Definition normalizeWeakType (wt:WeakType) : WeakType := wt. Fixpoint weakTypeToCoreType' (wt:WeakType) : CoreType := match wt with | WTyVarTy (weakTypeVar v _) => TyVarTy v + | WAppTy (WAppTy WFunTyCon t1) t2 => FunTy (weakTypeToCoreType' t1) (weakTypeToCoreType' t2) | WAppTy t1 t2 => match (weakTypeToCoreType' t1) with | TyConApp tc tys => TyConApp tc (app tys ((weakTypeToCoreType' t2)::nil)) | t1' => AppTy t1' (weakTypeToCoreType' t2) @@ -120,9 +97,7 @@ Definition compare_weakTypes (w1 w2:WeakType) := then true else false. -(* Coq's "decide equality" can't cope here; we have to cheat for now *) -Axiom compare_weakTypes_axiom : forall w1 w2, if compare_weakTypes w1 w2 then w1=w2 else not (w1=w2). - +(* Instance EqDecidableWeakType : EqDecidable WeakType. apply Build_EqDecidable. intros. @@ -133,6 +108,7 @@ Instance EqDecidableWeakType : EqDecidable WeakType. left; auto. right; auto. Defined. +*) Instance WeakTypeToString : ToString WeakType := { toString := coreTypeToString ○ weakTypeToCoreType }.