Les gardes sont décrits dans Haskell 2010 section 3.13, Expressions de cas (cette section traite des expressions de cas, et non des déclarations de premier niveau, mais la sémantique est probablement la même) :
guards | guard1, …, guardn (n 1)
guard pat <- infixexp (pattern guard)
| let decls (local declaration)
| infixexp (boolean guard)
Pour chaque expression gardée, les gardes séparées par des virgules sont essayées séquentiellement de gauche à droite. Si elles réussissent toutes, l'expression correspondante est évaluée dans l'environnement étendu avec les liaisons introduites par les gardes. En d'autres termes, les liaisons introduites par une garde (soit en utilisant une clause let ou une garde de motif) ont une portée dans les gardes suivantes et dans l'expression correspondante. Si l'une des gardes échoue, l'expression gardée échoue et l'expression gardée suivante est essayée.
Dans le cas simple, la virgule joue un rôle similaire à celui de la virgule booléenne. y . Mais la virgule est plus puissante en ce sens que chaque garde peut introduire de nouvelles liaisons qui sont utilisées par les gardes suivantes (en procédant de gauche à droite).
Les virgules dans les gardes sont suffisamment rares (d'après mon expérience, du moins) pour que je décrive cette fonctionnalité comme un détail de Haskell -- pas du tout nécessaire pour écrire (ou, la plupart du temps, lire) Haskell. Je pense que Programmation en Haskell : les premiers principes l'omet pour cette raison.
3 votes
Je suppose qu'il s'agit de l'équivalent de logique et ? Mais j'imagine que d'autres débutants en haskell se posent la même question et je me suis donc dit qu'il serait peut-être bon de poser cette question sur stackoverflow.
0 votes
Même si vous connaissez la réponse, il serait bon de publier cette question (éventuellement accompagnée d'une réponse, si c'était le cas).
0 votes
Mis à jour le wiki .