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.