Question

Est-il possible ( any chemin) pour mettre en œuvre des contraintes dans les classes de type?

À titre d'exemple de ce que je parle, je suppose veux mettre en place un groupe en tant que classe de type. Donc, un type serait un groupe s'il y a trois fonctions:

class Group a where
    product :: a -> a -> a  
    inverse :: a -> a 
    identity :: a

Mais ce ne sont pas des fonctions, mais ils doivent être liés par certaines contraintes. Par exemple:

product a identity = a 
product a (inverse a) = identity
inverse identity = identity

etc ...

Est-il possible d'appliquer ce genre de contrainte dans la définition de la classe afin que toute instance hérite automatiquement? À titre d'exemple, supposons que je voudrais mettre en œuvre le groupe C2, défini par:

 data C2 = E | C 

 instance Group C2 where
      identity = E 
      inverse C = C

Ces deux définitions détermine de façon unique C2 (les contraintes ci-dessus définissent toutes les opérations possibles - en fait, C2 est le seul groupe possible avec deux éléments en raison des contraintes). Y at-il un moyen de faire ce travail?

Était-ce utile?

La solution

  

Est-il possible d'appliquer ce genre de contrainte?

Non. Lots de personnes ont demandé, y compris l'illustre Tony Hoare, mais rien ne semble à l'horizon encore.

Ce problème serait un excellent sujet de discussion pour le Haskell Premier groupe. Si quelqu'un a flotta une bonne proposition, il est probablement être trouvés.

P.S. Ceci est un problème important!

Autres conseils

Dans certains cas, vous pouvez spécifier les propriétés à l'aide QuickCheck. Ce n'est pas exactement application, mais il vous permet de fournir des tests génériques que tous les cas doivent passer. Par exemple, avec l'équation que vous pourriez dire:

prop_EqNeq x y = (x == y) == not (x != y)

Bien sûr, il est encore à l'auteur d'instance pour appeler ce test.

Faire cela pour les lois monade serait intéressant.

classes de type peuvent contenir des définitions ainsi que des déclarations. Exemple:

class Equality a where
    (?=), (!=) :: a -> a -> Bool

    a ?= b = not (a != b)
    a != b = not (a ?= b)

instance Eq a => Equality a where
    (?=) = (==)

test = (1 != 2)

Vous pouvez également spécifier des contraintes particulières (Appelons les lois ) dans Haskell plaine, mais il est pas garanti que le compilateur les utiliser. Un exemple commun sont lois monades

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