--- Remove any duplicate type variables in family instances may have non-linear
--- left-hand sides. Complain if any, but the first occurence of a type
--- variable has a user-supplied kind signature.
---
-pruneTyVars :: TyClDecl RdrName -> RnM [LHsTyVarBndr RdrName]
-pruneTyVars tydecl
- | isFamInstDecl tydecl
- = do { let pruned_tyvars = nubBy eqLTyVar tyvars
- ; assertNoSigsInRepeats tyvars
- ; return pruned_tyvars
- }
- | otherwise
- = return tyvars
- where
- tyvars = tcdTyVars tydecl
-
- assertNoSigsInRepeats [] = return ()
- assertNoSigsInRepeats (tv:tvs)
- = do { let offending_tvs = [ tv' | tv'@(L _ (KindedTyVar _ _)) <- tvs
- , tv' `eqLTyVar` tv]
- ; checkErr (null offending_tvs) $
- illegalKindSig (head offending_tvs)
- ; assertNoSigsInRepeats tvs
- }
-
- illegalKindSig tv
- = hsep [ptext (sLit "Repeat variable occurrence may not have a"),
- ptext (sLit "kind signature:"), quotes (ppr tv)]
-
- tv1 `eqLTyVar` tv2 = hsLTyVarLocName tv1 `eqLocated` hsLTyVarLocName tv2
-