Advanced lenses
One of the interesting insights of the function-based lens representation is that we can both generalize and specialize in various ways. These variations are often still compatible: they can be composed. We have already seen one example of this:
type Lens' s v = forall f. Functor f => (v -> f v) -> (s -> f s) type Lens s t v w = forall f. Functor f => (v -> f w) -> (s -> f t)
The polymorphic lens is a generalization of the monomorphic one. When we have a monomorphic and a polymorphic lens of compatible types, they can be combined to yield a new monomorphic lens. For example, if we combine the _1
lens with the salary
lens, we get a new lens that focuses on the salary of the employee in the first component of a tuple:
_1 . salary :: Lens' (Employee, b) Int
Another way in which specialization is possible is through the functor type parameter, f
, in the lens definition.
Getters and setters
Earlier...