Die Semantik der Musteranpassung in dem folgenden Abschnitt der Norm definiert sind: Formal Semantics of Pattern Matching.
Der Schritt, der für Ihre Frage relevant ist, ist c. Wie Sie sehen können, mit Wachen Spiele Muster der Form
case v of { p | g1 -> e1 ; ...
| gn -> en where { decls }
_ -> e' }
zu Muster übersetzt Spiele ohne Wachen wie:
case e' of
{y ->
case v of {
p -> let { decls } in
if g1 then e1 ... else if gn then en else y ;
_ -> y }}
So definiert Wachen Muster in Bezug auf if
und „fallthrough“ implementiert indem Sie den Ausdruck an eine Variable binden und sie dann einmal in der else
-Klausel von if
und dann in dem Muster wiederholen, in das Sie fallen würden.
Wenn es kein Fall durch fallen (wie in Ihrem Beispiel) wird man Schritt b eingefügt worden, die einen Standard-Fall _ -> error "No match"
Danke für die Referenz. Ich würde gerne in der Lage sein, einen Zweig als Mustervergleichsfehler zu markieren, aber ich kann sehen, warum eine solche Funktionalität von der Sprache nicht angeboten wird. Vielen Dank! – Ozgur