
forgot to CC list.
---------- Forwarded message ----------
From: David Barbour
But it's ugly. Always the same, only the record selector has another name. Is it possible to generalize it?
You can generalize using template haskell. I believe Oleg's HList already provides such mechanisms, so you don't need to do this yourself. If you're doing this a lot, try the HList package. (If not, just do the Also, I would say you've too tightly coupled your BigData to the MonadicEnv. I suggest you reduce it instead to: setX :: X -> BigData -> BigData setX x' bd = bd { dataX = x' } updX :: (X -> X) -> BigData -> BigData updX fx bd = bd { dataX = fx (dataX bd) } Then in your state monad you can use: modify (setX x') gets dataX And use of 'updX' is much more composable. That aside, from personal experience, I'm usually okay just using: modify (\ s -> s { dataX = x' }) in the few places I need it.