5

私のレコード (多数のフィールドを持つ) が次のように定義されているとします。

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
                  }

フィールドの 1 つが変更されSample_Recordたタイプの新しいレコードを作成できますか?a

4

1 に答える 1

11

はい。方法はたくさんあります。シンプルなのは

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拡張機能を使用すると、余分なボイラープレートなしでレコード フィールドを値として使用できます ( is f (C {a=a}) = asame as f (C {a}) = a)

{-# LANGUAGE NamedFieldPuns #-}
baz b@(Sample_Record {record_field1, record_field2, record_field3 = 0}) = 
   b{ record_field3 = record_field1 + record_field2 }
于 2013-09-27T10:42:02.480 に答える