# \[RFC\] Mutable records as a GHC extension

**URL:** <https://discourse.haskell.org/t/rfc-mutable-records-as-a-ghc-extension/13886>\
**Category:** Uncategorized\
**Created:** [April 4, 2026, 10:04am UTC](https://discourse.haskell.org/t/rfc-mutable-records-as-a-ghc-extension/13886 "2026-04-04T10:04:31Z")\
**Posts on this page:** 1\
**Showing post:** 6

<div class="post-metadata">

**Author:** ![AntC2](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/antc2/32/1872_2.png) [@AntC2](https://discourse.haskell.org/u/AntC2)\
**Post date:** [April 5, 2026, 10:09am UTC](https://discourse.haskell.org/t/rfc-mutable-records-as-a-ghc-extension/13886/6 "2026-04-05T10:09:57Z")

</div>

> [@BurningWitness](#):
>
> ADTs cannot be updated in place, they’re constructed anew each time, right? Why do we then use `x { a = b }` and not `C { a = b, .. = x }`?

I agree with your distaste for that syntax. I especially dislike it’s called ‘update’ syntax, because there’s no update going on in the imperative programming sense of overwriting a location. ‘rebuild shorthand’ might be better terminology. I always use the explicit constructor syntax, which works reasonably smoothly with the `..` RecordWildcards.

I agree the `HasField` and friends/‘update’ mechanisms are just too perplexing to be worth using. Indeed auto-naming a function same as a field (as in H98) runs counter to the drive to eliminate punning from other parts of the language.

What’s more perspicuous in the earlier proposal’s `data` decl is that a mutable structure can appear only within `IO` (or `ST`).

---

_[View the full topic](https://discourse.haskell.org/t/rfc-mutable-records-as-a-ghc-extension/13886)._
