- co_fn :: [TyVar] -> TyCon -> ExprCoFn
- co_fn tvs cls_tycon | Just co_con <- newTyConCo tycon
- = ExprCoFn (mkAppCoercion -- (mkAppsCoercion
- (mkTyConApp cls_tycon [])
- -- rep_tys)
- (mkTyConApp co_con (map mkTyVarTy tvs)))
- | otherwise
- = idCoercion
+ -- For newtype T a = MkT <ty>
+ -- The returned coercion has kind :: C (T a):=:C <ty>
+ co_fn tvs cls_tycon cls_inst_tys | Just co_con <- newTyConCo tycon
+ = ExprCoFn (mkTyConApp cls_tycon (drop_tail 1 cls_inst_tys ++
+ [mkSymCoercion (mkTyConApp co_con (map mkTyVarTy tvs))]))
+ | otherwise
+ = idCoercion
+ drop_tail n l = take (length l - n) l
+
+------------------------
+-- Ordinary instances