26 | Funciones puras anónimas |
Despu
és de los ejemplos que se han visto en Wolfram Language, se puede pasar a un nivel de abstracci
ón ligeramente m
ás elevado, y abordar el concepto, muy importante, de las
funciones puras (tambi
én llamadas
funciones puras anónimas).
El uso de las funciones puras dará paso a un nuevo nivel de capacidades en Wolfram Language, y permitirá reformular algunas de las cosas que ya se han hecho de manera más simple y elegante.
Para empezar, se toma un ejemplo sencillo. Dada una lista de im
ágenes, se quiere aplicar
Blur a cada una. Esto se logra f
ácilmente mediante
/@.
Aplique
Blur a cada una de las im
ágenes en la lista:
Ahora, sup
óngase que se quiere incluir el par
ámetro 5 en
Blur.
¿C
ómo hacerlo? La respuesta es usar una funci
ón pura.
Incluya un parámetro mediante la introducción de una función pura:
La borrosidad original, escrita en términos de una función pura:
El
# es una
“ranura
” donde se coloca cada elemento. El
& indica que lo que est
á escrito antes de
él es una funci
ón pura.
Aqu
í se presenta en detalle el equivalente de
Blur[#, 5]&/@... :
Se ver
án a continuaci
ón otros ejemplos. En cada ocasi
ón, la ranura indica d
ónde ha de colocarse cada elemento al aplicar la funci
ón pura.
Aplique una rotaci
ón de 90
° a cada cadena de caracteres:
Tome una cadena de caracteres y hágala girar en diferentes ángulos:
Muestre texto en una lista de colores diferentes:
Cree c
írculos de diferentes tama
ños:
Muestre colores y sus negativos en columnas enmarcadas:
Calcule las longitudes de tres art
ículos de Wikipedia:
Empareje los temas con sus resultados:
Haga una rejilla con todo ello:
Lo siguiente forma una lista de d
ígitos y mapea una funci
ón pura sobre ella:
Esto es lo que la función pura haría al mapearse sobre {6, 8, 9}:
Vistos los anteriores ejemplos de las funciones puras en acción, se revisará, de manera más abstracta, lo que sucede.
Lo siguiente mapea una función pura abstracta sobre una lista:
A continuación, el ejemplo mínimo:
Eso es equivalente a:
Las ranuras se pueden colocar en cualquier parte de la función pura y tantas veces como se quiera. Todas ellas se llenarán con aquello a lo que se esté aplicando la función pura.
Se aplica ahora una función pura ligeramente más complicada:
Lo anterior se lee con mayor facilidad si se coloca en una columna:
Ahora se puede analizar ya c
ómo trabajan, en realidad, las funciones puras. Al escribir
f[x], se est
á aplicando la funci
ón
f a
x. Muchas veces se usa alguna funci
ón con un nombre espec
ífico en vez de
f, por ejemplo,
Blur, de modo que se tiene
Blur[x], etc.
El asunto es que se puede también reemplazar la f con una función pura. Entonces, la ranura que aparece en la función pura se llenará con el argumento al que se quiere aplicar.
Al aplicar una funci
ón pura a
x, la ranura
# se llena con
x:
Una forma equivalente, escrita con
@ en vez de
[...]:
Ahora se puede ver lo que hace
/@: simplemente aplica la funci
ón pura a cada elemento de la lista.
Lo mismo, pero escrito de manera más explícita:
¿Por qu
é es
útil esto? Primero, porque es el fundamento de todo lo que las funciones puras hacen con
/@. Pero, de hecho, a menudo es
útil por s
í mismo; por ejemplo, es una forma de evitar repeticiones.
Aqu
í est
á un ejemplo de una funci
ón pura donde aparece tres veces la
#.
Si no se usara la funci
ón pura, habr
ía que ponerlo como sigue:
En Wolfram Language, una función pura trabaja de la misma forma que cualquier otra cosa. Sin embargo, por sí sola, no hace nada.
Si se introduce una función pura por sí sola, regresará sin cambios:
Sin embargo, si se escribe con la funci
ón
Map (
/@) llevar
á a cabo un c
álculo.
Map usa la funci
ón pura para efectuar un c
álculo:
Se verán cada vez más usos de las funciones puras a lo largo de las próximas secciones.
código& | | una función pura |
# | | ranura en una función pura |
26.1Use
Range y una funci
ón pura para crear una lista de los 20 primeros cuadrados.
»
26.2Forme una lista con los resultados de mezclar el amarillo, el verde y el azul con el rojo.
»
26.3Genere una lista de columnas enmarcadas que contengan las versiones may
úscula y min
úscula de cada letra del alfabeto ingl
és.
»
26.4Forme una lista de las letras del alfabeto ingl
és en colores aleatorios y enmarcadas con colores de trasfondo aleatorios.
»
26.5Genere una lista de los pa
íses del G5 y sus banderas, acomodando el resultado en una rejilla totalmente enmarcada.
»
26.6Construya una lista con las nubes de palabras de los art
ículos en Wikipedia sobre
“apple
”,
“peach
” y
“pear
”.
»
26.7Forme la lista de los histogramas de las longitudes de palabra de los art
ículos en Wikipedia sobre
“apple
”,
“peach
” y
“pear
”.
»
26.8Haga una lista de los mapas de Centroam
érica, con cada pa
ís resaltado, caso por caso.
»
+26.1Escriba de una manera m
ás simple
(#^2+1&)/@Range[10].
»
¿Por qué se les llama “funciones puras”?
Porque lo
único que hacen es servir como funciones que se aplican a argumentos. Tambi
én se les llama
funciones anónimas porque, a diferencia de
Blur, por ejemplo, no tienen un nombre. Se usan aqu
í ambos t
érminos, como en
“funciones puras an
ónimas
”, para dar a entender los dos significados.
¿Por qu
é se necesita el
&?
El
& (
ampersand) indica que lo que viene antes de
él es el
“cuerpo
” de una funci
ón pura y no el nombre de una funci
ón.
f/@{1, 2, 3} da
{f[1], f[2], f[3]}, pero
f&/@{1, 2, 3} da
{f, f, f}.
¿C
ómo se interpreta
f[#, 1]& ?
- Las funciones puras son características de la programación funcional. Se suelen llamar expresiones lambda, nombre derivado de su utilización en la lógica matemática en los años 1930s. Se presta a confusión el hecho de que el término “función pura” a veces se refiera a una función que no tiene efectos colaterales (esto es, que no asigne valores a variables, etc.)
- Table[f[x], {x, {a, b, c}}] efectivamente hace lo mismo que f/@{a, b, c}. A veces es útil, en especial cuando no se quiere entrar a explicar lo que son las funciones puras.
- ¡Debe tener cuidado cuando se tienen varios & anidados en una expresión! A veces será necesario insertar paréntesis. Y, a veces, habrá de usarse Function con una variable denominada, como en Function[x, x^2] más que #^2&, para evitar conflictos entre posibles usos de # para funciones diferentes.
- En ocasiones se puede obtener código más presentable si se escribe Function[x, x^2] como xx^2. La puede escribirse como \ [Function] o fn. La forma del tipo x x^2 coincide con la notación matemática estándar para “x se mapea a x^2” o “x se convierte en x^2”.
- Frecuentemente las opciones pueden ser funciones puras. Es importante encerrar la función pura completa entre paréntesis, como en ColorFunction(Hue[#/4]&), para evitar una interpretación no deseada.