map abs [-1, 2, 3] => [1, 2, 3]
Arrays are the simplest example, but it looks like an iterable. However functors retain shape whereas iterables don't. For example if we had a tree (represented visually): oak = -1
/ \
2 3
If we used oak as an iterable, we would lose the structure of the tree: map abs iter(oak) => [1, 2, 3]
However if tree belongs to the functor typeclass (i.e. implements functor interface), then: map abs oak => 1
/ \
2 3
The alternatives to functors are:1. mutate the existing data structure
2. copy a new one and then mutate (two passes)
3. create a new one while mutating (one pass, increased complexity / bugs)