Since any lens could be used in either the viewing or the setting "mode", we'll need to at least specify view X
for each lens X. But for any lens l :: Lens' a b
, view l
has a type like a -> b
if you translate some of the MonadReader
noise.
We can thus get rid of some of the repetition using the Applicative
instance for ((->) a)
.
thing & fun <$> view c <*> view a <*> view d <*> view b