Elixirs Enumerable protocol is built upon the implementation of
reduce for different kinds of data structures.
Basically, there are things that you cannot do with just map, and things you cannot do with just reduce. You can build a semi-working map on top of reduce, but this will not work in the following circumstances:
- Concurrent access to elements. (see for instance conc lists)
- Changing values inside complex trees without modifying the tree shape. (AFAIK there is no way for
reduceto know the shape of the container it is working on)
(there is possibly more; let us know)
As a side note, the current
reduce algorithm and most of the other functions in
Enum that use it internally always return the result as a list.
Of course, there are some things that are reducable but not mappable, such as Ranges.
There are other things that are mappable, but not reducable, such as for instance a ‘Maybe’ (that is either
Some x or
I think it is interesting to brainstorm about this; Maybe the addition of a
Mappable protocol isn’t such a weird idea…