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 --
This is a good job for lenses:
Then:
would update field 'c' of 'test' to your string.
You don’t need to define auxiliary functions or employ lenses. Standard Haskell has already what you need. Let’s take the example by Don Stewart:
Then you can just say
test { c = "Goodbye" }
to get an updated record.