La semántica de coincidencia de patrones se definen en la siguiente sección de la norma: Formal Semantics of Pattern Matching.
El paso que es relevante para su pregunta es c. Como se puede ver, patrón coincide con los guardias de la forma
case v of { p | g1 -> e1 ; ...
| gn -> en where { decls }
_ -> e' }
se convierten a patrón coincide con y sin guardias como:
case e' of
{y ->
case v of {
p -> let { decls } in
if g1 then e1 ... else if gn then en else y ;
_ -> y }}
Así guardias de patrón se definen en términos de if
y "fallthrough" se implementa vinculando la expresión a una variable y luego repitiéndola una vez en la cláusula else
del if
y luego en el patrón al que te vas a referir.
Si no hay ningún caso a caer a través de (como en el ejemplo) uno se habrá insertado por el paso b, que inserta un caso por defecto _ -> error "No match"
Gracias por la referencia. Me encantaría poder marcar una rama como error de coincidencia de patrón, pero puedo ver por qué el lenguaje no ofrece esa funcionalidad. ¡Gracias! – Ozgur