2013-09-27 11 views
5

Supponiamo che il mio record (con il gran numero di campi) è definito in questo modo:Crea nuovo record con variazione di un valore

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 
        } 

Posso fare un nuovo record del tipo Sample_Record da a che ha uno dei suoi campo modificato?

+0

possibile duplicato del [C'è un idioma Haskell per l'aggiornamento di una struttura dati nidificata?] (http://stackoverflow.com/questions/7365425/is-there-a-haskell-idiom-for-updating-a-nested-data-structure) –

risposta

10

Sì. Abbiamo molti modi. Il semplice è

foo b = b {record_field1 = 1} 

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

Abbiamo alcune estensioni. caratteri jolly consentono di non utilizzare tutti i record nel modello,

{-# 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} 

Con NamedFieldPuns estensione potremmo usare i campi dei record come valori senza boilerplate extra (f (C {a=a}) = a è stessa 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 } 
Problemi correlati