Restricciones de tipo en todas las instancias de familias de tipos

Supongo que lo que quiero es imposible sin Template Haskell, pero lo preguntaré de todos modos.

Tengo una interfaz para tipos comoData.Set yData.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
  ...

Y tengo una familia de tipos que elige la implementación óptima del conjunto:

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

Hay una manera de garantizar queEfficientSet instancias siempre seránSetLike y esoElem (EfficientSet a) esa ?

Sin esta garantía, todas las firmas de funciones serán así:

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

Para escribir cada vezSetLike LocationSet es algo tolerable, peroElem LocationSet ~ Location hace que la comprensión del código solo sea más difícil, como para mí.

Respuestas a la pregunta(6)

Su respuesta a la pregunta