Syntax-Standardwert für Accessor aufzeichnen

9

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

  1. verwendet intelligente Konstruktoren, die theoretisch Skirt Male foo zulassen, aber keine Konstruktoren
  2. anzeigen
  3. definiere meine eigene 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.

    
Dan Burton 18.01.2012, 19:27
quelle

2 Antworten

0
  

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.

    
Dan Burton 03.02.2012, 07:55
quelle
0

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

ausgewertet

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).

    
Titou 25.03.2015 19:09
quelle

Tags und Links