Mapa (programación)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 30 de octubre de 2018; las comprobaciones requieren 7 ediciones .

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 * x

entonces 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.

Comparación de idiomas

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.

mapen varios idiomas

Mapa en varios idiomas
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>

Optimizaciones

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

Notas

  1. "Fusión de mapas: Haskell un 225 % más rápido" . Consultado el 17 de julio de 2011. Archivado desde el original el 6 de agosto de 2013.

Véase también