Control.Lens
is almost certainly what you want. Data.Lens
came first, and is simpler, but Control.Lens
has many advantages, and is being actively developed.
Other than lenses, Control.Lens
has many related types, like traversals (a traversal is like a lens that can refer to n values instead of just one), folds, read/modify-only lenses, indexed lenses, isomorphisms... It also comes with a much larger library of useful functions and predefined lenses for standard library types, Template Haskell to derive lenses, and a bunch of code for other things like generic zippers and uniplate-style generic traversal.
It's a big library -- you don't have to use all of it, but it's nice to have the thing you want already written.
The main advantage of Data.Lens
is that it's simpler, and as such doesn't require extensions beyond Haskell 98. But note that if you just want to export a Control.Lens
-style lens from a library, you can do it without leaving Haskell 98 -- in fact, without depending on the package at all.