Then you can compose these lenses together and retain these properties. You can also pick lenses which operate with different multiplicities from 0 to infinity. Finally, you can use their seemless connection to object isomorphisms to create a very general interface for working with various kinds of "similar" objects in Haskell.
At the end of the day you can write a first-class lens which represents getting and setting over a set of parameterized Map keys deeply inside of a stateful computation, mapping over anything that looks like a string, and viewing/modifying it as decoded JSON.
obj . ix "aKey" . each . _Object . ix "3" . _Number .~ 4
might modify a record in a type like this IsString s => SomeState { obj :: Map s s }
where the string values of the Map have a JSON schema like {"1" ..., "2" ..., "3": <aNumber> }