La semantica di pattern matching sono definite nella seguente sezione della norma: Formal Semantics of Pattern Matching.
Il passaggio pertinente alla domanda è c. Come si può vedere, modello corrisponde con le guardie della forma
case v of { p | g1 -> e1 ; ...
| gn -> en where { decls }
_ -> e' }
sono convertiti al modello corrisponde senza protezioni come:
case e' of
{y ->
case v of {
p -> let { decls } in
if g1 then e1 ... else if gn then en else y ;
_ -> y }}
Così guardie del modello sono definiti in termini di if
e "falltrough" è implementato legando l'espressione a una variabile e quindi ripetendola una volta nella clausola else
dello if
e quindi nel modello a cui si farebbe riferimento.
Se non c'è nessun caso a cadere fino al (come nel tuo esempio) si saranno stati inseriti dopo passo b, che inserisce un caso di default _ -> error "No match"
Grazie per il riferimento. Mi piacerebbe essere in grado di contrassegnare un ramo come errore di corrispondenza del modello, ma posso capire perché tale funzionalità non è offerta dalla lingua. Grazie! – Ozgur