Quel est le “|” pour une définition de classe Haskell?

Je ne peux pas comprendre ce que signifie “| m -> w” -part dans une définition de classe comme celle-ci:

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

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

La barre verticale est un séparateur syntaxique sans sens lui-même, utilisé pour introduire des dépendances fonctionnelles sur une classe de type multi-parameters, donc techniquement | ne signifie rien du tout. Sans doute | a été choisi comme analogie visuelle avec le même symbole que celui utilisé pour les gardes-formes sur les fonctions.

En ce qui concerne les dépendances fonctionnelles elles-mêmes, il suffit de lire x -> y tant que “paramètre de type x détermine uniquement le paramètre de type y “, ce qui signifie que connaître x seul suffit pour trouver l’instance correcte. Il y a d’autres complications, en particulier avec d’autres extensions GHC activées, mais la plupart du temps, vous n’avez pas à vous en soucier.

En revanche, sans dépendances fonctionnelles, la sélection d’une instance d’une classe de type multi-parameters nécessite que tous les parameters de type soient connus. Un exemple typique a un paramètre étant un type de conteneur et un second étant le type des éléments contenus; des fonctions telles que “concaténer” ou “isEmpty” n’ont pas besoin de mentionner le type d’élément, uniquement le type de conteneur, et seraient donc ambiguës.

En outre, si vous écrivez vos propres classes de type, envisagez plutôt d’utiliser des familles de types , qui constituent une nouvelle approche pouvant éventuellement remplacer les dépendances fonctionnelles. En gros, les familles de types vous permettent d’écrire des définitions de types surchargées dans une instance, pas seulement des fonctions surchargées.

Il spécifie une dépendance fonctionnelle .