
Hi Dennis,
I think you mean this:
r { x = f (x r) }
Yes, I made a typo. Thanks for advising ghc-vis.
In GHC: In your example a new record is built, but all its entries (x in this case) are shared.
The problem is, that in case of nested records, if an inner record is updated, the whole path to that record is copied. Of course copying just the path to the inner data is a lot better than copying the whole tree of data, but my proposal is about to optimize it further: don't copy of the path if the updated value is identical to the original one. The Agda compiler may benefit by this optimization for example. In fact, the last version of the proposal[^1] will copy the path to keep laziness properties, but it does it in such a way that the GC can collect the copied path instead of trying to collect the old path (which will if it is shared). [^1]: http://www.haskell.org/pipermail/haskell-cafe/2012-November/104311.html Does this make sense to you? Peter