Ok, das oben Gesagte ist in Ordnung, aber wenn ich das Muster-Matching für die Edge-Fälle um GHCI tausche, wirft «Mehrere Deklarationen von» Fehler für zeilen 2 und 4. Hier verwendet f1 keine Mustersynonyme. Um dem numerischen Muster 42 zu entsprechen, muss der Aufrufer die Einschränkungen (Num a, Eq a) erfüllen, damit sie im Typ f1 angezeigt werden. Der Aufruf zum Anzeigen generiert eine (Show b) Einschränkung, wobei b eine existenziell typisierte Variable ist, die durch die Musterübereinstimmung auf MkT gebunden ist. Aber die gleiche Musterübereinstimmung bietet auch die Einschränkung (Zeigen b) (siehe MkT-Typ), und so ist alles in Ordnung. Ansichtsmuster sind ein wenig wie Musterwächter, die in anderen Mustern verschachtelt werden können. Sie sind eine bequeme Möglichkeit, Muster mit Werten abstrakter Typen abzugleichen. In einer Programmiersprachenimplementierung können wir beispielsweise die Syntax der Typen der Sprache wie folgt darstellen: Genau wie Signaturen auf Wertbindungen können Mustersynonymsignaturen auf mehr als ein Muster angewendet werden. Wenn jedoch musterübereinstimmend auf Baz1 die übereinstimmenden Werte für Gleichheit verglichen werden können und wenn Musterabgleich auf Baz2 der erste übereinstimmende Wert in eine Zeichenfolge konvertiert werden kann (sowie die Funktion darauf anwenden). Dieses Programm ist also legal: In diesem Sinne ist der Umfang einer Mustervariablen ein strömungsabhängiges Konzept, das einer bestimmten Zuweisung ähnelt (Kapitel 16).
Die Regeln, die im Rest dieses Abschnitts definiert sind, haben absichtlich eine ähnliche Form wie in Kapitel 16. Unidirektionale Synonyme können nur in einem Musterkontext verwendet werden und sind wie folgt definiert: Wäre es nicht für eine Ausnahmesituation, könnte eine lokale Variable immer als erstellt betrachtet werden, wenn ihre lokale Variablendeklarationsanweisung ausgeführt wird. Die Ausnahmesituation beinhaltet die switch-Anweisung (14.11), bei der es für die Steuerung möglich ist, einen Block einzugeben, aber die Ausführung einer lokalen Variablendeklarationsanweisung zu umgehen. Aufgrund der Einschränkungen, die durch die Regeln der definitiven Zuweisung (16) auferlegt werden, kann die lokale Variable, die von einer solchen umgangenen lokalen Variablendeklaration deklariert wird, jedoch nicht verwendet werden, bevor ihr definitiv ein Wert durch einen Zuweisungsausdruck zugewiesen wurde (15.26). Der Client erstellt die Objektstruktur direkt oder indirekt und instanziiert die konkreten Besucher. Wenn ein Vorgang ausgeführt werden soll, der mithilfe des Besuchermusters implementiert wird, ruft er die Accept-Methode der Elemente der obersten Ebene auf. Angesichts der Funktionalität von GADTs (Generalized Algebraic Data Types) könnte es so aussehen, als ob eine Definition wie die obige machbar sein sollte. Allerdings sind Typfamilien – im Gegensatz zu GADTs – offen; d.h.
neue Instanzen können immer hinzugefügt werden, möglicherweise in anderen Modulen. Das Unterstützen des Musterabgleichs zwischen verschiedenen Dateninstanzen würde eine Form des erweiterbaren Fallkonstrukts erfordern. Eine Deklaration d einer lokalen Variablen, einer Mustervariablen oder eines Ausnahmeparameters mit dem Namen n shadows im gesamten Bereich von d, (a) den Deklarationen aller anderen Felder mit dem Namen n, die an dem Punkt, an dem d auftritt, im Gültigkeitsbereich sind, und (b) den Deklarationen aller anderen Variablen mit dem Namen n, die sich an dem Punkt befinden, an dem d auftritt, aber nicht in der innersten Klasse deklariert werden, in der d deklariert ist. Sie können nicht muster-match auf einem existenziell quantifizierten Konstruktor in einem let oder wo Gruppe von Bindungen. Dies ist also illegal: (Hier verwenden wir Ansichtsmustersyntax für die Übersetzung, siehe Muster anzeigen.) Mustersynonyme ermöglichen die Abstraktion von der Darstellung, um Übereinstimmungen verfügbar zu machen, die sich konstruktiv in Bezug auf musterabgleich verhalten. Wir können Mustersynonyme für die bekannten Typen erstellen, die uns wichtig sind, ohne die Darstellung an sie weiterzugeben (beachten Sie, dass diese nicht im selben Modul wie der Typtyp definiert werden müssen): Jeder Datentyp, der in der Standardmäßigen Haskell 98-Syntax deklariert werden kann, kann auch mit der Syntax im GADT-Stil deklariert werden. Die Wahl ist weitgehend stilistisch, aber GADT-Deklarationen unterscheiden sich in einem wichtigen Punkt: Sie behandeln Klasseneinschränkungen für die Datenkonstruktoren unterschiedlich.








