Let's say I have the following record ADT:
data Foo = Bar { a :: Integer, b :: String, c :: String }
I want a function that takes a record and returns a record (of the same type) where all but one of the fields have identical values to the one passed as argument, like so:
walkDuck x = Bar { a = a x, b = b x, c = lemonadeStand (a x) (b x) }
The above works, but for a record with more fields (say 10
), creating a such function would entail a lot of typing that I feel is quite unnecessary.
Are there any less tedious ways of doing the same?
Yes, there's a nice way of updating record fields. In GHCi you can do --
> 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" }