Map (高阶函数)
语言比较

映射函数出现在函数式编程语言之中。现在映射函数在很多过程式、面向对象和多范型语言中也能获得到（或能够定义）：在C++的标准模板库中，它叫做std::transform，在C#（3.0）的LINQ库中，它被作为叫做Select的扩展方法。映射也经常在高级语言中的计算，比如ColdFusion标记语言（英语：）（CFML）、Perl、Python和Ruby；在这四种语言中这个运算都叫做map 。在Ruby中还提供collect作为map的别名（来自Smalltalk）。有些语言通过语法构造提供与映射函数相同的功能。
映射有时被推广为接收二元的（2个参数）函数，它可以把用户提供的函数应用到来自两个列表的对应元素上。有些语言对它使用特殊名字，比如“map2”或“zipWith”。使用显式的可变元数函数的语言拥有可变元数版本的映射来支持可变元数函数。有2个或更多列表在这些列表有不同长度的时候遇到需要处理的问题。各种语言在这个问题上是不同的。有些引起异常。有些在达到最短列表长度之后停止并忽略在其他列表上的额外项目。有些继续直到最长列表长度，并对已经结束的列表，向函数传递某个占位符的值来指示没有值。
| 语言 | Map | Map 2个列表 | Map n个列表 | 注释 | 处理不同长度的列表 |
| --- | --- | --- | --- | --- | --- |
| APL | func list | list1 func list2 | func/ list1 list2 list3 list4 | APL的数组处理能力使得map这样的运算隐式进行 | 如果列表窗度不相等或者是1则长度错误 |
| Common Lisp | (mapcar func list) | (mapcar func list1 list2) | (mapcar func list1 list2 ...) |  | 在达到最短列表长度后停止 |
| C++ | std::transform(begin, end, result, func) | std::transform(begin1, end1, begin2, result, func) |  | 在头文件<algorithm>中 begin、end和result是迭代器 书写结果起始于result |  |
| C# | ienum.Select(func) 或 select子句 | ienum1.Zip(ienum2, func) |  | Select是扩展方法  ienum是个IEnumerable Zip介入于.NET 4.0 在所有.NET语言中都类似 | 在最短列表结束后停止 |
| CFML（英语：） | obj.map(func) |  |  | 这里的obj是一个数组或结构。func接受作为参数的是每个项目的值，它的索引或键，和到最初对象的引用。 |  |
| Clojure | (map func list) | (map func list1 list2) | (map func list1 list2 ...) |  | 在最短列表结束后停止 |
| D | list.map!func | zip(list1, list2).map!func | zip(list1, list2, ...).map!func |  | 给定给zip可通过StoppingPolicy: 最短、最长或requireSameLength |
| Erlang | lists:map(Fun, List) | lists:zipwith(Fun, List1, List2) | zipwith3也能得到 |  | 列表必须等长 |
| Elixir | Enum.map(list, fun) | Enum.zip(list1, list2) |> Enum.map(fun) | List.zip([list1, list2, ...]) |> Enum.map(fun) |  | 在最短列表结束后停止 |
| F# | List.map func list | List.map2 func list1 list2 |  | 函数对其他类型存在（Seq和Array） | 抛出异常 |
| Groovy | list.collect(func) | [list1 list2].transpose().collect(func) | [list1 list2 ...].transpose().collect(func) |  |  |
| Haskell | map func list | zipWith func list1 list2 | zipWithn func list1 list2 ... | n对应于列表的数目，预先定义直到zipWith7 | 在最短列表结束后停止 |
| Haxe | array.map(func)  list.map(func)  Lambda.map(iterable, func)  |  |  |  |  |
| J | func list | list1 func list2 | func/ list1, list2, list3 ,: list4 | J的数组处理能力使得map这样的运算隐式进行 | 如果列表长度不等则长度错误 |
| Java 8+ | stream.map(func) |  |  |  |  |
| JavaScript 1.6 ECMAScript 5 | array#map(func) （页面存档备份，存于） | List1.map(function (elem1, i) {  return func(elem1, List2[i]); }) | List1.map(function (elem1, i) {  return func(elem1, List2[i], List3[i], ...); }) | Array#map 传递3个实际参数到func: 元素、元素的索引和这个数组。不用的实际参数可以忽略。 | 在List1结束时停止，用undefined项目扩展较短的数组，如果需要的话。 |
| Julia | map(func, list) | map(func, list1, list2) | map(func, list1, list2, ..., listN) |  | ERROR: DimensionMismatch |
| Logtalk（英语：） | map(Closure, List) | map(Closure, List1, List2) | map(Closure, List1, List2, List3, ...) (直到7个列表) | 只有Closure参数必须被实例化。 | 失败 |
| Mathematica | func /@ list   Map[func, list] | MapThread[func, {list1, list2}] | MapThread[func, {list1, list2, ...}] |  | 列表必须等长 |
| Maxima | map(f, expr1, ..., exprn) maplist(f, expr1, ..., exprn) |  |  | map返回一个表达式，其前导算子同于这个表达式的算子； maplist返回一个列表 |  |
| OCaml | List.map func list  Array.map func array | List.map2 func list1 list2 |  |  | 发起Invalid_argument异常 |
| PARI/GP（英语：） | apply(func, list) |  |  |  | 不適用 |
| Perl | map block list  map expr, list |  |  | 在block或expr中特殊变量$_持有依次来自这个列表的值。 | Helper List::MoreUtils::each_array组合多于一个列表直到最长的那个被耗尽，用undef.填入其他的。 |
| PHP | array_map(callable, array) | array_map(callable, array1,array2) | array_map(callable, array1,array2, ...) | callable的形式参数的数目 应当匹配数组的数目。 | 用NULL项目扩展较短的列表 |
| Prolog | maplist(Cont, List1, List2). | maplist(Cont, List1, List2, List3). | maplist(Cont, List1, ...). | 列表实际参数是输入、输出或二者。也包括zipWith, unzip, all | 静默失败（不是错误） |
| Python | map(func, list) | map(func, list1, list2) | map(func, list1, list2, ...) | 在Python 2中返回一个列表，在Python 3中返回一个迭代器。 | zip()和map() (3.x)在最短列表结束后停止，而map()(2.x)和itertools.zip_longest()(3.x)用None项目扩展较短的列表 |
| Ruby | enum.collect {block}  enum.map {block} | enum1.zip(enum2).map {block} | enum1.zip(enum2, ...).map {block}   [enum1, enum2, ...].transpose.map {block} | enum is an Enumeration | 在它调用在其上的对象（第一个列表）结束时停止；如果任何其他列表更短，用nil项目扩展它 |
| Rust | list1.into_iter().map(func) | list1.into_iter().zip(list2).map(func) |  | Iterator::map和Iterator::zip方法二者接受最初迭代器的所属关系并返回一个新的；Iterator::zip方法内部的调用IntoIterator::into_iter方法在list2之上 | 在较短列表结束后停止 |
| S-R | lapply(list, func) | mapply(func, list1, list2) | mapply(func, list1, list2, ...) |  | 较短列表被循环 |
| Scala | list.map(func) | (list1, list2).zipped.map(func) | (list1, list2, list3).zipped.map(func) | 注意：多于3不可能。 | 在较短列表结束后停止 |
| Scheme（包括Guile和Racket） | (map func list) | (map func list1 list2) | (map func list1 list2 ...) |  | 列表必须都有相同长度（SRFI-1扩展接受不同长度的列表） |
| Smalltalk | aCollection collect: aBlock | aCollection1 with: aCollection2 collect: aBlock |  |  | 失败 |
| Standard ML | map func list | ListPair.map func (list1, list2)   ListPair.mapEq func (list1, list2) |  | 对于2实际参数map，func接受在一个元组中的实际参数 | ListPair.map在最短列表结束后停止，而ListPair.mapEq引起UnequalLengths异常 |
| Swift | sequence.map(func) | zip(sequence1, sequence2).map(func) |  |  | 在最短列表结束后停止 |
| XPath 3 XQuery（英语：） 3 | list ! block  for-each(list, func) | for-each-pair(list1, list2, func) |  | 在block上下文中项目.持有当前值 | 在最短列表结束后停止 |