estrições de tipo em todas as instâncias da família de tip

Suponho que o que eu quero seja impossível sem o Template Haskell, mas perguntarei de qualquer maneir

Tenho uma interface para tipos comoData.Set eData.IntSet:

type family Elem s :: *
class SetLike s where
  insert :: Elem s -> s -> s
  member :: Elem s -> s -> Bool
  ...

type instance Elem (Set a) = a
instance Ord a => SetLike (Set a) where
  ...

E eu tenho uma família de tipos que escolhe a implementação ideal do conjunto:

type family EfficientSet elem :: *
type instance EfficientSet Int = IntSet
type instance EfficientSet String = Set String -- or another implementation

Existe uma maneira de garantir queEfficientSet instâncias serão sempreSetLike e essaElem (EfficientSet a) éa ?

Sem esta garantia, todas as assinaturas de funções serão assim:

type LocationSet = EfficientSet Location
f :: (SetLike LocationSet, Elem LocationSet ~ Location) => ...

Para escrever cada vezSetLike LocationSet é um pouco tolerável, masElem LocationSet ~ Location dificulta a compreensão do código, quanto a mim.