Kann Konstruktor mit verschiedenen Parametern erfasst und wiederverwendet werden?

7

Wenn wir einen Typ Person definiert haben wie:

%Vor%

Kann das:

%Vor%

als eine Definition von flipNames geschrieben werden? Können wir den verwendeten Konstruktor irgendwie erfassen und mit anderen Parametern wiederverwenden? Etwas wie:

%Vor%     
omittones 16.01.2014, 22:04
quelle

5 Antworten

5

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.

    
Ganesh Sittampalam 16.01.2014, 22:06
quelle
11

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:

%Vor%     
Nikita Volkov 16.01.2014 22:13
quelle
3

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.

%Vor%

Mit diesem in der Datei person.hs erhalten Sie diese Ausgabe:

%Vor%

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 .

    
asm 16.01.2014 22:13
quelle
2

Ja, Sie können ähnliche (aber nicht identische) Suchmuster verwenden!

%Vor%     
viorior 17.01.2014 08:38
quelle
1

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.

    
Tikhon Jelvis 16.01.2014 22:09
quelle