29 | Más sobre las funciones puras |
Se ha visto ya c
ómo formar listas y arreglos con
Table. Tambi
én las funciones puras pueden utilizarse para ese prop
ósito, usando
Array.
Genere un arreglo de 10 elementos mediante una función abstracta f:
Use una funci
ón pura para generar la lista de los 10 primeros cuadrados:
Table permite obtener el mismo resultado, aunque en ese caso habr
ía que introducir la variable
n:
Array[f,4] forma una lista sencilla de 4 elementos.
Array[f,{3,4}] forma un arreglo de 3
×4.
Haga una lista de longitud 3, donde cada uno de sus elementos sea una lista de longitud 4:
Muestre lo anterior en una rejilla:
En el caso de que la funci
ón fuera
Times,
Array construir
ía una tabla de multiplicar:
Y,
¿si se quiere usar una funci
ón pura en vez de
Times? Cuando se calcula
Times[3,4], se est
á indicando que
Times se aplique a dos
argumentos. (En
Times[3,4,5],
Times se aplica a tres argumentos, etc.). En una funci
ón pura,
#1 representa al primer argumento,
#2 al segundo argumento, y as
í sucesivamente.
#1 representa el primer argumento,
#2 el segundo argumento:
#1 siempre elige el primer argumento, y #2 el segundo argumento:
Ahora se podr
á usar
#1 y
#2 dentro de una funci
ón en
Array.
Use una función pura para formar una tabla de multiplicar:
Use una función pura diferente que ponga una x siempre que los números sean iguales:
Aqu
í se ve el c
álculo equivalente efectuado mediante
Table:
Vistas las funciones puras con m
ás de un argumento, se puede comenzar a ver
FoldList. Puede considerarse a
FoldList como una generalizaci
ón de
NestList cuando se tienen dos argumentos.
NestList toma una funci
ón individual, tal como
f, y la va anidando sucesivamente:
Esto puede comprenderse mejor si se usa la funci
ón
Framed:
NestList simplemente aplica de nuevo una funci
ón al resultado obtenido en el
último paso, cualquiera que sea.
FoldList hace lo mismo salvo que, adicionalmente, incorpora un nuevo elemento cada vez.
Aqu
í se presenta
FoldList con una funci
ón abstracta
f:
Si se usa la funci
ón
Framed se hace un poco m
ás f
ácil comprender lo que sucede:
De entrada, esto puede parecer complicado y oscuro, y se hace difícil imaginar de qué manera podría ser útil. Sin embargo, efectivamente lo es, y es también insospechadamente común en programas reales.
FoldList es muy apropiado para acumular cosas progresivamente. T
ómese de entrada un caso sencillo: sumar n
úmeros progresivamente.
En cada paso
FoldList incorpora otro elemento (
#2), a
ñadi
éndolo al resultado que se ha obtenido hasta ese momento (
#1):
Aquí se despliega el proceso que se va llevando a cabo:
O, de manera equivalente:
Puede ser m
ás f
ácil ver lo que sucede si se usan s
ímbolos:
Desde luego, este caso es demasiado sencillo y no se necesita recurrir a una función pura:
Un uso cl
ásico de
FoldList es en la incorporaci
ón sucesiva de d
ígitos para reconstruir un n
úmero a partir de la lista de sus d
ígitos.
Construya un número, de manera sucesiva, a partir de sus dígitos, comenzando el proceso de incorporación con el primer dígito:
Por
último, se usar
á FoldList para incorporar im
ágenes progresivas de una lista, a
ñadiendo una, en cada paso, con
ImageAdd a la imagen obtenida hasta ese momento.
Incorpore progresivamente im
ágenes de una lista, usando
ImageAdd para combinarlas:
Al principio, el concepto de
FoldList no es lo m
ás sencillo de comprender. Pero una vez que se adquiere familiaridad con
él, se habr
á aprendido una t
écnica por dem
ás poderosa de la
programación funcional, que ejemplifica el tipo de abstracci
ón elegante que se hace posible con Wolfram Language.
Array[f,n] | | forma un arreglo mediante la aplicación de una función |
Array[f,{m,n}] | | forma un arreglo de 2 dimensiones |
FoldList[f,x,list] | | aplica una función sucesivamente, incorporando los elementos de una lista |
29.1Use
Prime y
Array para generar la lista de los 100 primeros primos.
»
29.2Use
Prime y
Array para encontrar las diferencias sucesivas entre los 100 primeros primos.
»
29.3Use
Array y
Grid para formar una tabla de sumar de 10 por 10.
»
29.4Use
FoldList,
Times y
Range para multiplicar los n
úmeros hasta el 10 sucesivamente (formando los factoriales).
»
29.5Use
FoldList y
Array para calcular los productos sucesivos de los 10 primeros primos.
»
29.6Use
FoldList para aplicar
ImageAdd sucesivamente a los pol
ígonos regulares de 3 a 8 lados, con opacidad 0.2.
»
+29.1Use
Array para formar una rejilla de 10 por 10, donde los elementos en la diagonal principal y abajo de ella sean 1, y el resto sean 0.
»
¿Qu
é significa
# por s
í solo?
Es equivalente a
#1, una ranura que se llena con el primer argumento de una funci
ón.
Ya sea como
“slot 1
” (que refleja su papel en una funci
ón pura), o
“hash 1
” (que refleja el c
ómo est
á escrito; la
“#” se conoce usualmente como
“hash
”).
¿Se pueden denominar los argumentos de una función pura?
S
í. Eso se hace con
Function[{x, y}, x+y], etc. A veces est
á bien hacerlo as
í para mejorar la legibilidad del c
ódigo, pero a veces es necesario cuando se anidan funciones puras.
¿Puede
Array formar estructuras con anidaci
ón de mayor profundidad?
Sí, con tanta profundidad como se desee. Listas de listas de listas... hasta cualquier número de niveles.
¿Qu
é es la programaci
ón funcional?
Es un paradigma de programaci
ón basado en evaluaci
ón de funciones y en combinaciones de funciones. De hecho, es el
único estilo de programaci
ón que se ha visto en el libro hasta el momento. En la
Sección 38 se ver
á la
programación por procedimientos, basada en moverse a trav
és de alg
ún procedimiento en el que se van cambiando progresivamente los valores de las variables.
- Fold da el último elemento de FoldList, del mismo modo que Nest da el último elemento de NestList.
- FromDigits reconstruye números a partir de la lista de sus dígitos y, de hecho, hace lo mismo que se hizo antes con FoldList.
- Accumulate[lista] es lo mismo que FoldList[Plus, lista].
- Array y FoldList, al igual que NestList, son ejemplos de lo que se llama funciones de orden superior, que toman funciones como entrada. (En matemáticas se conocen también como funcionales, o funtores).
- Pueden armarse funciones puras que tomen cualquier número de argumentos a la vez, usando ##, etc.
- Puede darse animación a listas de imágenes usando ListAnimate, y mostrarse las imágenes apiladas en 3D mediante Image3D.