Existe-t-il une bibliothèque qui utilise des contraintes pour généraliser toutes les classes de type de base pour permettre des contraintes?

StackOverflow https://stackoverflow.com//questions/12697348

  •  12-12-2019
  •  | 
  •  

Question

Nous pouvons utiliser les contraintes d'extension pour étendre la fonctionnalité des classes de type de base pour permettre des contraintes.Par exemple, nous pouvons faire un vecteur non Boxe un foncteur:

class Functor f where
    type FunctorConstraint f x :: Constraint
    type FunctorConstraint f x = ()
    fmap :: (FunctorConstraint f a, FunctorConstraint f b) => (a -> b) -> f a -> f b

instance Functor VU.Vector where
    type FunctorConstraint VU.Vector x = VU.Unbox x
    fmap = VU.map

(voir ces blog messages pour plus de détails).

Je me suis remarqué de mettre en œuvre une partie assez grande des classes de type de la bibliothèque de base dans ce nouveau style (essentiellement, je souhaite pouvoir travailler de manière interchangeable entre des vecteurs et des listes non compromis) et je me demande si une bibliothèque pour cela existe déjà queJe devrais utiliser, ou si je devrais chair la mine et l'ajouter au piratage.


Edit: De plus, y a-t-il des plans pour ajouter cela directement à la base?Il semble que cela ne cédait rien d'autre simplement en mettant à jour les définitions de la classe directement.

Était-ce utile?

La solution

Comme cela ressemble à personne d'autre n'a une bibliothèque, j'ai converti ce que j'ai fait dans un projet distinct appelé contraintekinds et Téléchargée sur Github .C'est extrêmement simple pour le moment et ne couvre probablement pas le cas d'utilisation d'un autre, mais n'hésitez pas à faire vos propres changements ou soumettre des demandes.

J'attendrai probablement plus de commentaires sur s'il s'agit d'une bonne direction avant de télécharger le projet sur Hackage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top