2013-09-27 20 views
5

Załóżmy mój rekord (z dużą liczbą pól) definiuje się następująco:Tworzenie nowego rekordu ze zmianą jednej wartości

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 
        } 

mogę zrobić nowy rekord typu Sample_Record z a który ma jeden z nich jest pole zmodyfikowane?

+0

możliwe duplikat [Czy istnieje idiom Haskella do aktualizacji zagnieżdżonej struktury danych?] (http://stackoverflow.com/questions/7365425/is-there-a-haskell-idiom-for-updating-a-nested-data- structure) –

Odpowiedz

10

Tak. Mamy wiele sposobów. Prosta jest

foo b = b {record_field1 = 1} 

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

Mamy kilka rozszerzeń. symboli wieloznacznych pozwolić, aby nie używać cały rekord w deseń,

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

Z NamedFieldPuns rozszerzenia możemy używać pól nagrać jako wartości bez dodatkowego boilerplate (f (C {a=a}) = a jest taka sama jak 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 } 
Powiązane problemy