2013-07-08 2 views
11

Zum Beispiel, ich habeWie man einzelne Werte in großen Objekten auf elegante Weise "ändert"?

data ShipDesign = ShipDesign { 
     offense :: Offense 
    , defense :: Defense 
    , maxHealth :: Integer 
    , repairRate :: Integer 
    , stealth :: Integer 
    , radar :: Integer 
    , speed :: Integer 
    , shipType :: String 
    ... 
    } 

Jetzt möchte ich, um die Verteidigung ändern. Die bekannte Art und Weise, dies zu tun ist:

changeDefense :: (Defense -> Defense) -> ShipDesign -> ShipDesign 
changeDefense fDef [email protected](ShipDesign o d m rr s r sp st ...) = ShipDesign o (fDef d) m rr s r sp st ... 

, die nicht elegant ist. Besonders in Spielen ist es üblich, nur ein paar Werte pro Schritt zu ändern.

Meine Frage ist: Gibt es eine Bibliothek, Design-Muster oder eine andere Möglichkeit, einen einzelnen Wert auf eine elegante Art und Weise zu ändern?

Antwort

15

Ja, können Sie Rekord Update Notation:

changeDefense :: (Defense -> Defense) -> ShipDesign -> ShipDesign 
changeDefense fDef sd = sd { defense = fDef (defense sd) } 

Wie Sie damit arbeiten, die Grenzen der Datensatzaktualisierung Notation selbst aber wird zeigen, und Sie werden etwas stärker wollen. An diesem Punkt sollten Sie beginnen, über lenses zu lernen.

+1

Eine Alternative ist es, direkt in Objektive zu springen, da sie (zumindest meiner Meinung nach) eine viel funktionellere Lösung für das Problem bieten als eine spezielle Syntax. – kqr

Verwandte Themen