Je suppose que ce que je veux est impossible sans Template Haskell mais je demanderai quand même.Contraintes de type sur toutes les instances de type famille
je une interface pour les types comme Data.Set
et Data.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
...
Et j'ai une famille de type qui choisit la mise en œuvre de jeu optimal:
type family EfficientSet elem :: *
type instance EfficientSet Int = IntSet
type instance EfficientSet String = Set String -- or another implementation
est-il un moyen de garantir que les EfficientSet
instances sera toujours SetLike
et que Elem (EfficientSet a)
est a
?
Sans cette garantie sera comme toutes les signatures de fonction ceci:
type LocationSet = EfficientSet Location
f :: (SetLike LocationSet, Elem LocationSet ~ Location) => ...
Pour écrire chaque fois SetLike LocationSet
est un peu tolérable, mais Elem LocationSet ~ Location
rend la compréhension du code que plus difficile, comme pour moi.
Vraiment? Une déclaration de synonyme 'type' peut définir non seulement un synonyme de type, mais un synonyme de contrainte de type? Intéressant. Est-ce que cela fonctionne aussi avec des contraintes implicites de type de paramètre? –
@JeffBurdges Yep: http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/constraint-kind.html –