2013-09-27 119 views
5

Giả kỷ lục của tôi (với số lượng lớn các lĩnh vực) được định nghĩa như thế này:Tạo kỷ lục mới với sự thay đổi ở một giá trị

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 
        } 

Tôi có thể làm cho một kỷ lục mới của các loại Sample_Record từ a trong đó có một trong đó là trường được sửa đổi?

+0

thể trùng lặp của [Có một thành ngữ Haskell để cập nhật cấu trúc dữ liệu lồng nhau?] (http://stackoverflow.com/questions/7365425/is-there-a-haskell-idiom-for-updating-a-nested-data-structure) –

Trả lời

10

Có. Chúng tôi có rất nhiều cách. Đơn giản là

foo b = b {record_field1 = 1} 

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

Chúng tôi có một số tiện ích. ký tự đại diện cho phép không sử dụng tất cả các kỷ lục trong mô hình,

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

Với NamedFieldPuns mở rộng chúng ta có thể sử dụng các trường kỷ lục như các giá trị mà không cần soạn thêm (f (C {a=a}) = a là giống như 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 }