How would setting/modification work in your scheme?
This problem has been solved a couple of times within the Haskell community and you're most likely looking for a lens library. They make data accessors first class and a subset of them compose in a way that reads just like object oriented notation. For example, with `lens` you can do the following:
data MyState = MyState { _person :: Person }
data Person = Person { _pos :: (Int, Int) }
makeLenses [''MyState, ''Person]
(person.pos._1 += 1) :: State MyState ()
Notice that the lenses compose with (.), compose in the order you expect from OO programming (and opposite normal function composition -- though it's actually the same), and allow you to set (as well as view). The `lens` package also provides these lenses for most of base along with many other useful tools for this kind of programming (notice _1 that acts as an accessor into a tuple).