In functional languages, map
traditionally refers to everyone's favourite1 high-order function. C++ and Java, on the other hand, follow a common mathematical usage: a “map” is a dictionary (an associative array, if anyone still uses that term). Clojure and Scala, being of mixed parentage, have both: their map
is the high-order function, and their dictionaries also have names containing Map
. This is only a little bit confusing, but both concepts are so important that they ought to have unambiguous names.
I usually prefer to reserve map
for the function, and dismiss the use of the same name for dictionaries because it's less familiar and it doesn't make much sense. But map
doesn't make much sense as a name for the function either. You can make excuses for it (it maps old elements of the list to new ones? it maps2 the function across the list?) but they're not very compelling; you can make equally good excuses for many other functions. The name is standard, but it's not a very good one.
Meanwhile, dictionaries are a common concept in need of a good name. “Dictionary” is four syllables, and “associative array” six (and misleading). “Hash” is too specific (and also a little misleading, since it ought to mean a hash function). But “map” is short, already somewhat well-known, and if not clear then at least not actively misleading. So maybe I should give up and call them maps, and find some other name for map
-the-function.
Is this outrageous?
There's no obvious better name. image
might be clear to mathematicians, but it's opaque to everyone else. elementwise
is too long. each
is comfortable, but suggests for-each
(as in Ruby) or every
. Repurposed prepositions like across
or through
are opaque, and tend to collide with natural-language uses (consider how annoying the C++/Java this
is in speech). Symbolic names are even more opaque, not to mention unpronounceable. Perhaps it acquired the name map
for lack of a good alternative.
It might be possible to avoid the issue by making the function unnecessary. If scalar operations are overloaded to operate elementwise on collections, as in APL, explicit map
would be much less common, so its name would be less important. It wouldn't be rare enough to ignore, though; many of its calls use operations that aren't scalar-only, or at least aren't obviously so, so they would still be written with explicit map
.
Another alternative is to merge it with some other function. If collections are seen as functions, map
is almost equivalent to compose
(especially in a lazy language). If compose
on a collection does map
, then there's no need for a separate map
function, especially if compose
has a short name like .
or ∘
. However, I have some difficulty understanding f . xs
as map f xs
. Composition and elementwise application may nearly coincide in meaning, but they're conceptually quite different.
1Except possibly for compose
.
2This use of “map” as a verb is presumably derived from the function, so it's a poor excuse.