In diesem speziellen Fall können Sie das folgendermaßen machen:
%Vor% Dies funktioniert jedoch nur, weil die Datensatzselektoren für Male
und Female
identisch sind. Es gibt keine allgemeine Abstraktion, die Konstruktoren ohne ihre Argumente erfasst.
Obwohl Ganesh Ihre genaue Frage beantwortet hat, möchte ich sagen, dass Ihr Problem einfach eine falsche Herangehensweise an das Design von Datentypen anzeigt.
Der folgende Ansatz ist viel flexibler und entfernt Ihr Problem als solches:
%Vor%Die Regel dahinter ist ziemlich einfach: Immer wenn Sie sehen, dass Sie mehrere Konstruktoren mit denselben Feldern erstellen, verwenden Sie einfach einen einzelnen Konstruktor und fügen Sie ein anderes Feld mit einem Aufzählungstyp ein, wie im obigen Code.
Sie werden keine Mustervergleichsfunktionen verlieren, da die Muster wie Person Male firstName lastName
sein können, und Sie können Gender
type ableiten Enum
und Bounded
machen, was Ihnen sicherlich helfen wird Typen, die nicht so trivial sind. Zum Beispiel:
Um eine weitere Option hinzuzufügen, könnten Sie etwas Ähnliches mit Phantomtypen machen. Beachten Sie, dass Sie dies tun möchten, weil Ihre Person
-Konstruktoren redundant sind, sie existieren nur, um männlich und weiblich zu unterscheiden. Sie könnten diese Unterscheidung in das Typsystem aufheben und die Art der Inferenz auf den Anteil Male
/ Female
anwenden lassen.
Mit diesem in der Datei person.hs
erhalten Sie diese Ausgabe:
Der Nachteil dabei ist, dass Sie den zusätzlichen Typparameter nicht mit sich herumtragen möchten. Der Vorteil besteht jedoch darin, dass Sie typeclass-Instanzen mit unterschiedlichen Implementierungen basierend auf Male
und Female
-Typen definieren können. Letzteres erfordert zwar die Erweiterung FlexibleInstances
.
Sie können eine Variable nicht mit einem solchen Konstruktor vergleichen, weil Muster keine erstklassigen Bürger in Haskell sind. Sie können Code haben, der für Ihre Funktion spezifisch ist, aber nichts Allgemeines.
Wenn Sie an solchen Ideen interessiert sind, schauen Sie sich die Forschungssprache bondi an, die unterstützt übereinstimmende Konstruktoren wie diese. Es eröffnet tatsächlich eine interessante neue Ausdruckskraft. In der Praxis macht es das Schreiben von Code, der generisch über die exakte Struktur des algebraischen Datentyps ist, viel einfacher.
Tags und Links haskell constructor programming-languages pattern-matching