La función map es una herramienta fundamental para transformar colecciones de datos de manera eficiente y elegante, sin alterar la estructura original. Su funcionamiento se basa en aplicar una función a cada elemento de una lista o mapa, generando una nueva lista con los resultados de esas aplicaciones.
En primer lugar, map es una función de aridad 2, lo que significa que recibe dos parámetros. El primero es un enumerado, como una lista de números [1, 2, 3, 4]. El segundo parámetro es otra función que acepta un único argumento, que será cada uno de los elementos del enumerado. Por ejemplo, si tenemos la lista [1, 2, 3, 4] y una función que multiplica por dos, map aplicará esa función a cada elemento: primero a 1, luego a 2, después a 3 y finalmente a 4.
El resultado es una nueva lista donde cada elemento es el resultado de aplicar la función al elemento correspondiente de la lista original. Así, si aplicamos la función que duplica el valor, obtendremos [2, 4, 6, 8]. Este proceso es lo que se denomina un mapeo, y aunque el nombre pueda llevar a confusión, no tiene relación con mapas geográficos, sino que proviene de la idea de transformar o mapear valores de un conjunto a otro.
Podemos complicar la función que pasamos a map tanto como queramos. Por ejemplo, podemos calcular el resto de dividir cada número entre 3, obteniendo una secuencia cíclica de restos como [1, 2, 0, 1, 2, 0, ...]. También podemos devolver valores booleanos, como true o false, dependiendo de si un número es divisible por otro, y map nos devolverá una lista con esos valores booleanos correspondientes a cada elemento.
Además de listas, map también puede trabajar con mapas (estructuras clave-valor). En este caso, la función que pasamos recibe una tupla con la clave y el valor. Por ejemplo, si tenemos un mapa con claves y valores, podemos usar map para extraer solo las claves o para crear una lista de cadenas que combinen la clave y el valor en un formato legible. El resultado será una lista con esas transformaciones.
Si queremos obtener un mapa a partir de la lista resultante de aplicar map, podemos hacerlo manualmente. Por ejemplo, si aplicamos una función que devuelve una tupla con el número y su doble, obtendremos una lista de tuplas como [{1, 2}, {2, 4}, {3, 6}, {4, 8}]. Luego, usando una función como map.new, podemos convertir esa lista de tuplas en un mapa propiamente dicho.
Es importante entender que map no filtra elementos, como hace filter. En lugar de eso, transforma cada elemento y devuelve todos los resultados, sin eliminar ninguno. Por eso, aunque podamos devolver valores booleanos, la lista resultante tendrá la misma longitud que la original.
Un aspecto a tener en cuenta cuando trabajamos con mapas es el pattern matching. Si no lo hacemos correctamente, podemos obtener resultados inesperados, como recibir tuplas sin procesar en la lista resultante. Por eso, es recomendable asegurarse de que la función que pasamos a map maneje adecuadamente la estructura de los elementos.
Finalmente, aunque map puede parecer sencilla, es fundamental dominar su uso antes de avanzar a funciones más complejas. Su capacidad para transformar colecciones de manera masiva y elegante la convierte en una herramienta imprescindible en programación funcional y en el manejo de datos en general.
Para ilustrar el uso básico de map, podemos ver este ejemplo en código:
lista = [1, 2, 3, 4]
resultado = Enum.map(lista, fn x -> 2 * x end)
# resultado: [2, 4, 6, 8]
Y si queremos trabajar con mapas y extraer solo las claves:
mapa = %{a: 1, b: 2, c: 3}
claves = Enum.map(mapa, fn {k, _v} -> k end)
# claves: [:a, :b, :c]
O para crear una lista de cadenas que combinen clave y valor:
mapa = %{a: 1, b: 2, c: 3}
combinado = Enum.map(mapa, fn {k, v} -> "#{k}: #{v}" end)
# combinado: ["a: 1", "b: 2", "c: 3"]
Si queremos convertir una lista de tuplas en un mapa:
lista_tuplas = [{1, 2}, {2, 4}, {3, 6}, {4, 8}]
mapa = Map.new(lista_tuplas)
# mapa: %{1 => 2, 2 => 4, 3 => 6, 4 => 8}
Así, map nos permite transformar datos de forma clara y concisa, facilitando el procesamiento de colecciones sin complicaciones.