56 votes

A quoi sert le "|" dans une définition de classe Haskell ?

Je n'arrive pas à comprendre ce que signifie la partie "| m -> w" dans une définition de classe comme celle-ci :

class (Monoid w, Monad m) => MonadWriter w m | m -> w

Quelles informations supplémentaires cela apporte-t-il à la définition de la classe ?

48voto

C. A. McCann Points 56834

La barre verticale est un séparateur syntaxique sans signification propre, utilisé pour introduire des dépendances fonctionnelles sur une classe de type multiparamétrique, donc techniquement | ne signifie rien du tout. Il est probable que les | a été choisi comme analogie visuelle avec l'utilisation du même symbole pour la protecteurs de modèles sur les fonctions.

En ce qui concerne les dépendances fonctionnelles proprement dites, il suffit de lire x -> y comme "paramètre de type x détermine de manière unique le paramètre de type y "ce qui signifie que le fait de connaître x suffit à trouver la bonne instance. Il existe d'autres complications, en particulier lorsque d'autres extensions de GHC sont activées, mais la plupart du temps, vous n'avez pas à vous en préoccuper.

En revanche, en l'absence de dépendances fonctionnelles, la sélection d'une instance d'une classe de type à paramètres multiples exige que tous les paramètres du type soient connus. Dans un exemple typique, un paramètre est un type de conteneur et un second est le type des éléments contenus ; des fonctions telles que "concatenate" ou "isEmpty" ne doivent pas mentionner le type d'élément, mais seulement le type de conteneur, et seraient donc ambiguës.

De même, si vous écrivez vos propres classes de types, envisagez plutôt d'utiliser les familles types qui constituent une nouvelle approche susceptible de remplacer à terme les dépendances fonctionnelles. D'une manière générale, les familles de types vous permettent d'écrire des définitions des types à l'intérieur d'une instance, et pas seulement les fonctions surchargées.

15voto

sepp2k Points 157757

Il spécifie un dépendance fonctionnelle .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X