Haskell 创建一个值发生更改的新记录

Haskell 创建一个值发生更改的新记录,haskell,record,Haskell,Record,假设我的记录(包含大量字段)定义如下: data Sample_Record = Sample_Record { record_field1 :: Int, record_field2 :: Int, record_field3 :: Float } a = Sample_Re

假设我的记录(包含大量字段)定义如下:

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
                  }

我是否可以从
a
中创建一个类型为
Sample\u record
的新记录,其中一个字段已修改?

是。我们有很多方法。最简单的是

foo b = b {record_field1 = 1}

> foo a
 Sample_Record { record_field1 = 1,record_field2 = 5, record_field3 = 5.4 }
我们有一些扩展。 通配符允许不使用模式中的所有记录

{-# LANGUAGE RecordWildCards #-}
bar b@(Sample_Record {record_field1 = 1,..}) = b {record_field1 = 10}
bar b@(Sample_Record {record_field1 = 2,..}) = b {record_field1 = 20}
使用
NamedFieldPuns
扩展,我们可以使用记录字段作为值,而无需额外的样板(
f(C{a=a})=a
f(C{a})=a

可能重复的
{-# LANGUAGE NamedFieldPuns #-}
baz b@(Sample_Record {record_field1, record_field2, record_field3 = 0}) = 
   b{ record_field3 = record_field1 + record_field2 }