Als ich gerade eine Antwort geschrieben habe , stieß ich auf ein interessantes Problem:
%Vor%Angenommen, ich möchte den letzten Datentyp mit Datensatzsyntax schreiben:
%Vor% Das Problem ist, ich möchte gender $ Skirt foo
immer auf Female
auswerten (unabhängig von foo
, was ein Age
ist). Ich kann mir einige Möglichkeiten vorstellen, dies zu erreichen, aber sie erfordern, dass ich entweder
Skirt Male foo
zulassen, aber keine Konstruktoren gender
Funktion Mit # 1, indem ich den Konstruktor im Modul nicht verfügbar mache, verhindere ich effektiv, dass Benutzer des Moduls die Aufzeichnungssyntax ausnutzen. Mit # 2 muss ich komplett auf die Record-Syntax verzichten oder eine zusätzliche Funktion gender'
definieren, die wiederum die Record-Syntax vereitelt.
Gibt es eine Möglichkeit, sowohl die Datensatzsyntax zu nutzen als auch einen "standardmäßigen", unveränderbaren Wert für einen meiner Konstruktoren bereitzustellen? Ich bin auch offen für Nicht-Datensatz-Syntax-Lösungen (Linsen, vielleicht?), Solange sie genauso elegant (oder mehr) sind.
Gibt es eine Möglichkeit, sowohl die Datensatzsyntax zu nutzen als auch einen "standardmäßigen", unveränderbaren Wert für einen meiner Konstruktoren bereitzustellen?
In Ermangelung eines überzeugenden Gegenbeispiels scheint die Antwort "nein" zu sein.
Ja, es gibt eine Spannung zwischen Typen und Daten ... was übrigens zeigt, wie dünn die Linie ist.
Die praktische Antwort ist die Verwendung einer Standardinstanz, wie im Haskell Wiki angegeben. Es beantwortet Ihre genaue Frage, da Sie die direkte Verwendung des Konstruktors aufgeben müssen.
Also für Ihr Beispiel,
%Vor%Entwickler können dann neue Instanzen mit Standardwerten erstellen, indem sie die Funktion zum Kopieren und Aktualisieren der Datensatzsyntax verwenden
%Vor% und gender newSkirt
werden zu Female
Ich möchte betonen, dass dieser Ansatz dazu führt, Standardwerte auf der Typ-Ebene zu definieren, was meiner Meinung nach eine gute Sache ist (der NoAge
-Konstruktor ist natürlich der Nothing
eines Maybe Age
-Typs).
Tags und Links haskell record default-value