1. ホーム
  2. haskell

[解決済み] レコードの単一フィールドを割り当て、残りのフィールドはコピーするための省略記法?

2022-06-14 14:20:01

質問

例えば、以下のようなレコードADTがあるとします。

data Foo = Bar { a :: Integer, b :: String, c :: String }

レコードを受け取り、1つのフィールドを除いて引数として渡されたものと同じ値を持つレコード(同じ型)を返す関数が欲しいのです。

walkDuck x = Bar { a = a x, b = b x, c = lemonadeStand (a x) (b x) }

上記は動作しますが、より多くのフィールドを持つレコードの場合(例えば 10 のように)、そのような関数を作成することは、私は非常に不要であると感じている多くの入力を伴うでしょう。

同じことをする、より退屈でない方法はありますか?

どのように解決するのですか?

そう、レコードのフィールドを更新するいい方法があるんです。GHCiでは以下のようなことができます。

> data Foo = Foo { a :: Int, b :: Int, c :: String }  -- define a Foo
> let foo = Foo { a = 1, b = 2, c = "Hello" }         -- create a Foo
> let updateFoo x = x { c = "Goodbye" }               -- function to update Foos
> updateFoo foo                                       -- update the Foo
Foo {a = 1, b = 2, c = "Goodbye" }