`updateWorld` of @Changaco can still be improved. I'll show it gradually so you can see what's going on. Firstly, we can eliminate duplication in `case` statement and use lens composition to eliminate second `over`: quantity Polymorph = quantityPolymorph quantity TeamPlayer = quantityTeamPlayer quantity LoneWolf = quantityLoneWolf updateWorld :: Fighter -> World -> World updateWorld fighter w = increment (quantity fighter) w where increment field = over (quantities . field) (+1) Then we can go pointfree. Pointfree is all about readability so don't do it whenever you feel readability is harmed. With coding experience more and more code will become readable for you. updateWorld = increment . quantity where increment field = over (quantities . field) (+1) Then we replace `over` with a more specialized version of it from `Control.Lens.Setter`: updateWorld = increment . quantity where increment field = (quantities . field) +~ 1 Now it seems beneficial to inline `increment`. I'll do in 2 steps. First, I make the actual parameter of `increment` explicit: updateWorld field = increment $ quantity field where increment field = (quantities . field) +~ 1 Then I inline: updateWorld :: Fighter -> World -> World updateWorld field = (quantities . quantity field) +~ 1