2013-04-17 5 views
9

ich tat diese Art der Sache in meinem Code:Verwenden Sie den numerischen Konstruktor mit dem algebraischen Datentyp, anstatt mit Maybe?

data MyType = Cons1 a b 
data OtherType = OtherType 
      { val1 :: Int 
      , val2 :: String 
      , val3 :: Maybe MyType 
      } 

und ich frage mich, ob der Code diese Veränderung ordentlicheres wäre/einfacher und was die Vor/Nachteile sind:

data MyType = Cons1 a b | Missing 
data OtherType = OtherType 
      { val1 :: Int 
      , val2 :: String 
      , val3 :: MyType 
      } 

Ich lese Zeilen aus einer Datei in [OtherType], jede Zeile hat 4 Spalten, wobei die Spalten 3 und 4 verwendet werden, um val3 :: MyType zu erstellen. Momentan benutze ich readMaybe, um a und b zu lesen und sie dann an eine Funktion weiterzuleiten, die Nothing zurückgibt, wenn beide Nothing oder Just MyType sind, wenn sie Just a und Just b sind. Ich dachte, ich könnte dies ändern, um Missing zurückzugeben und damit eine Schicht Verpackung zu entfernen.

Antwort

10

Es gibt zwei kleinere Vorteile Ihrer zweiten Ansatz:

  1. Durch eine Dereferenzierungsebene Ausschneiden, Funktionen, die Sie schreiben und dass die Traverse Werte von OtherType im Allgemeinen etwas einfacher geworden (aber nicht spektakulär).
  2. Durch die Wahl eines guten Namens für den nullary-Konstruktor, den Sie hinzufügen, kann Ihr Code selbsterklärender werden (im Vergleich zur Verwendung des eher generischen Namens Nothing an verschiedenen Stellen).

Ein großer Nachteil ist, dass Sie die Fähigkeit zu verwenden, um alle vordefinierten Funktionen verlieren, die die Standard-Bibliotheken, die Sie geben mit Maybe -Werten zu arbeiten und dass Sie sich die entsprechende Funktionalität codieren.

+0

Die OtherType-Defs wurden korrigiert – flimbar

22

sollten Sie fügen nur den Missing Konstruktor MyType, wenn es sinnvoll, alle MyType Werte macht Missing die Möglichkeit zu haben. Sie müssen Missing in allen Funktionen behandeln, die MyType Werte betreffen. Wenn die Mehrheit dieser nicht-total-throw einen Fehler oder sonst ausfallen würde - dann gehört eindeutig Missing nicht in MyType und Sie sollten stattdessen einfach Maybe MyType verwenden.

Einfach ausgedrückt: Wenn die Optionalität dem Typ inhärent ist, kodieren Sie sie im Typ. Ansonsten halte es getrennt.

+12

N.B. Dies ist ein spezieller Fall des Prinzips "kein Müll": Wenn Sie einen Datentyp entwerfen, machen Sie alles, was keinen Sinn ergibt, vollständig nicht darstellbar - machen Sie die möglichen Werte nach Haskell genau so wie die möglichen Werte in Ihrem Modell . – luqui

Verwandte Themen