2013-09-27 7 views
5

meinen Rekord ist definiert wie folgt Angenommen (mit einem großen Anzahl von Feldern):in einem Wert mit einer Änderung neue Datensatz erstellen

data Sample_Record = Sample_Record { record_field1 :: Int, 
            record_field2 :: Int, 
            record_field3 :: Float 
            } 

a = Sample_Record { record_field1 = 4, 
        record_field2 = 5, 
        record_field3 = 5.4 
        } 

Kann ich einen neuen Rekord der Sample_Record von a Art machen, die hat eine seiner Feld modifiziert?

+0

möglich Duplikat [Gibt es ein Haskell-Idiom zum Aktualisieren einer verschachtelten Datenstruktur?] (http://stackoverflow.com/questions/7365425/is-there-a-haskell-idiom-for-updating-a-nested-data-structure) –

Antwort

10

Ja. Wir haben viele Wege. Das Einfache ist

foo b = b {record_field1 = 1} 

> foo a 
Sample_Record { record_field1 = 1,record_field2 = 5, record_field3 = 5.4 } 

Wir haben einige Erweiterungen. WildCards erlauben nicht alle Datensätze in Mustern zu verwenden,

{-# LANGUAGE RecordWildCards #-} 
bar [email protected](Sample_Record {record_field1 = 1,..}) = b {record_field1 = 10} 
bar [email protected](Sample_Record {record_field1 = 2,..}) = b {record_field1 = 20} 

Mit NamedFieldPuns Erweiterung wir Satzfelder als Wert ohne zusätzlichen Text nutzen könnten (f (C {a=a}) = a gleiche wie f (C {a}) = a)

{-# LANGUAGE NamedFieldPuns #-} 
baz [email protected](Sample_Record {record_field1, record_field2, record_field3 = 0}) = 
    b{ record_field3 = record_field1 + record_field2 } 
Verwandte Themen