La sémantique de correspondance de motif sont définies dans la section suivante de la norme: Formal Semantics of Pattern Matching.
L'étape qui correspond à votre question est c. Comme vous pouvez le voir, le motif correspond à des gardes de la forme
case v of { p | g1 -> e1 ; ...
| gn -> en where { decls }
_ -> e' }
sont convertis à motif correspond sans gardes comme:
case e' of
{y ->
case v of {
p -> let { decls } in
if g1 then e1 ... else if gn then en else y ;
_ -> y }}
Ainsi, les gardiens de motif sont définis en termes de if
et « fallthrough » est mis en œuvre en liant l'expression à une variable, puis en la répétant une fois dans la clause else
du if
, puis dans le canevas auquel vous tombez.
S'il n'y a aucun cas tomber jusqu'à (comme dans votre exemple) on aura été inséré par l'étape b, qui insère un cas par défaut _ -> error "No match"
Merci pour la référence. J'aimerais pouvoir marquer une branche comme une erreur de correspondance de modèle, mais je peux voir pourquoi une telle fonctionnalité n'est pas offerte par le langage. Merci! – Ozgur