map es una función de orden superior utilizada en muchos lenguajes de programación que aplica alguna función a cada elemento de la lista de sus argumentos, produciendo una lista de resultados como valor de retorno. Cuando se ve en forma funcional, a menudo se lo denomina "aplicar a todos" .
Por ejemplo, si define una función squarecomo esta:
cuadrado x = x * xentonces la llamada map square [1,2,3,4,5]devolverá una lista [1,4,9,16,25], ya que mapaplicará la función squarea cada elemento, recogiendo los resultados en el mismo orden.
Una función que mapse originó a partir de lenguajes de programación funcional , pero que se admite (o se define) en muchos lenguajes de procedimiento , orientados a objetos y multiparadigmáticos , por ejemplo: en la biblioteca de plantillas estándar de C++ se llama transform, en C# (3.0) se representa por Select_ La función también se usa con frecuencia en lenguajes de alto nivel como Perl , Python y Ruby ; en los tres idiomas la función se llama map. Ruby maptambién tiene un alias para collect. Common Lisp tiene toda una familia de funciones similares a mapas; mapcar, correspondiente al comportamiento descrito aquí (el sufijo carsignifica acceso a través de la operación CAR ). También hay lenguajes con construcciones de sintaxis que brindan una funcionalidad similar a map.
A veces hay una versión genérica mapque toma una función de dos argumentos, 2 listas, y la aplica a los elementos correspondientes de las listas. Algunos idiomas les dan nombres especiales como map2o zipWith. Una función mapcon dos o más listas da lugar al problema de trabajar con listas de diferentes longitudes. Distintos lenguajes se comportan de manera diferente: algunos lanzan una excepción, otros se detienen cuando se llega al final de una lista corta e ignoran el resto de los elementos de listas más largas, otros van a la más larga, devolviendo algún valor especial para listas cuyos valores ya han terminado.
En los lenguajes que admiten funciones de primera clase , mapse puede usar con curry para proporcionar una función que realice una transformación predefinida en una lista. Por ejemplo, map squareen Haskell, una función que devuelve una lista, cada elemento de la cual es igual al elemento correspondiente de la lista de argumentos, al cuadrado.
Idioma | Mapa | Mapa 2 listas | Mapa n listas | notas | Comportamiento para listas de diferentes longitudes |
---|---|---|---|---|---|
Haskell | lista de funciones del mapa | zipCon función lista1 lista2 | zipCon n función lista1 lista2 ... | n corresponde al número de listas; definido hasta zipWith7 | se detiene después del final de la lista más corta |
Haxé | Lambda.map( iterable , func ) | ||||
j | lista de funciones | lista de funciones de lista | func / lista1 , lista2 , lista3 , : lista4 | Las capacidades de manejo de matrices del lenguaje le permiten llamar implícitamente a funciones como map | Las listas deben tener la misma longitud (error de longitud si las listas no son iguales) |
OCaml | List.map func lista Array.map func array |
List.map2 función lista1 lista2 | lanza una excepción Invalid_argument | ||
ML estándar | lista de funciones del mapa | Función
ListPair.map ( lista1 , lista2 ) Función ListPair.mapEq ( lista1 , lista2 ) |
Para un mapa de dos listas, func obtiene los elementos como una tupla . | ListPair.map se detiene cuando llega al final de la lista más corta, ListPair.mapEq lanza una excepción UnequalLengths | |
Pitón | mapa ( función , lista ) | mapa( función , lista1 , lista2 ) | mapa ( función , lista1 , lista2 , …) | zip() y map() (versión 3.x) se detienen al final de la lista más corta, map() (2.x) e itertools.zip_longest() (3.x) expanden listas cortas con valores Ninguno | |
rubí | enum .collect { bloque } enum .map { bloque } |
enum1 .zip( enum2 ).mapa { bloque } | enum1 .zip( enum2 , …).map { bloque } [ enum1 , enum2 , …].transpose.map { bloque } |
enumeración es una enumeración | se detiene cuando llega al final de la lista en la que se llama a la función (la primera lista); si alguna otra lista es más corta, se expande con valores nulos |
C++ | std::transform( inicio , final , resultado , función ) | std::transform( begin1 , end1 , begin2 , result , func ) | en el encabezado <algorithm> begin , end y result iteradores , el resultado se escribirá al principio del resultado |
||
Perl | mapa lista de bloques mapa expr , lista |
En block o expr , el valor especial $_ contiene cada valor en la lista. | N / A | ||
C# 3.0 | enumeración . Seleccionar ( función ) | ||||
C# 4.0 | enumeración . Seleccionar ( función ) | ienum1 .Zip( ienum2 , función ) | se detiene cuando se alcanza el final de la lista más corta | ||
JavaScript 1.6 | array .map( función ) | - | - | map solo se proporciona como un método de matriz, por lo que solo se puede aplicar una lista (matriz) | |
ceceo común | ( lista de funciones de mapcar ) | ( función mapcar lista1 lista2 ) | (función mapcar lista1 lista2 ... ) | Se detiene cuando se alcanza el final de la lista más corta | |
Esquema , Clojure | ( lista de funciones del mapa ) | ( función de mapa lista1 lista2 ) | ( función de mapa lista1 lista2 ...) | Se detiene cuando se alcanza el final de la lista más corta | |
Charla | aCollection recopilar: aBlock | aCollection1 con: aCollection2 recopilar: aBlock | Cayendo | ||
Erlang | listas: mapa ( diversión , lista ) | listas: zipwith( Diversión , Lista1 , Lista2 ) | zipwith3 también está disponible | Las listas deben tener la misma longitud. | |
PHP | array_map( devolución de llamada , matriz ) | array_map ( devolución de llamada , matriz1 , matriz2 ) | matriz_mapa( devolución de llamada , matriz1 , matriz2 , ...) | El número de argumentos de devolución de llamada debe coincidir con el número de matrices. |
expandir listas cortas con valores NULL |
Matemática | func /@ lista Mapa[ func , lista ] |
MapThread[ func , { lista1 , lista2 }] | MapThread[ función , { lista1 , lista2 , …}] | Las listas deben tener la misma longitud. | |
MATLAB | arrayfun ( función, lista ) | arrayfun ( función, lista 1 , lista 2 ) | arrayfun ( función, lista 1 , ..., lista n ) | cellfun para listas de celdas | |
Máxima | map( f , expr 1 , …, expr n ) maplist( f , expr 1 , …, expr n ) |
||||
S / R | lapply( lista , función ) | mapply( función , lista1 , lista2 ) | mapply( función , lista1 , lista2 ,…) | Las listas cortas son cíclicas | |
Scala | lista .mapa ( función ) | ( lista1 , lista2 ).zipped.map( func ) | ( lista1 , lista2 , "lista3").comprimido.mapa( función ) | no más de 3 listas. | se detiene cuando llega al final del más corto |
Java 8 | list.stream().map(función) | sin funciones de primera clase; Se utiliza la interfaz java.lang.Function<T, R> |
La base matemática de la operación mappermite muchas optimizaciones . (map f . map g) xs(donde " " es el .operador de composición de la función ) es equivalente a map (f . g) xs ; eso es: . Esta optimización elimina la necesidad de una doble llamada al combinar la aplicación de funciones y [1] . mapfg
La función mapse puede definir usando el pliegue de la lista . En particular, id xs = map id xs = foldr (:) [] xs = xs. La combinación de foldy mapse puede optimizar: foldr f z . map gequivalente a foldr (f . g) z, por lo tanto map g xs = (id . map g) xs = foldr ((:) . g) [] xs. Tal implementación map, cuando se usa con listas enlazadas individualmente en lenguajes no perezosos , no es directamente compatible con la optimización de recursividad de cola (aunque es módulo contra ) optimizable, por lo que puede conducir a un desbordamiento de pila si se aplica a listas grandes . En muchos idiomas, existe una "función de mapa invertido" alternativa, que es equivalente a la función de mapa en el caso de una lista publicada, pero con la posibilidad de optimizar la recursividad de la cola. Implementación usando el pliegue izquierdo:
revMap f xs = foldl ( \ ys x -> f x : ys ) [] xs