>>103250195
Abstraction is taxonomy. Good abstraction just means you've named the right parts. A good name lets you use it without thinking about the details of the definition.
For example a Haskell value with type Lens' s a
is a setter/getter gets used with several other functions. I don't have to think about type Lens' s a = forall f. Functor f => (a -> f a) -> (s -> f a)
to synthesize or decide over (traversed._1) (2+)
is a function that adds two to the first element of every tuple in the supplied collection. It's easier to think about a specialization of function composition (.) :: Traversal' a b -> Lens' b c -> Traversal a c
than to inline the type aliases and end up with a type that has 11 ->