Un otoño sin hojas
Un gato me mira a lo lejos, con ojos de reproche, aun cuando no sé el porqué, ¿acaso pensará que le daré comida? Dudo que sea tan optimista; ¿Tendré algo en mi cara? El espejo dice que no; ¿O será una simple curiosidad? Quizá, dicen que los gatos son observadores; el hecho es que me mira como si fuera sospechoso de algo. Aunque para ser culpable de un crimen debe haber una víctima. No recuerdo una víctima. Así que, hasta donde yo sé, soy inocente.
En la curiosidad de los gatos encuentro mi curiosidad por el otoño. No sé bien el motivo, pero me gusta ver las hojas caer. La temperatura desciende. La chaqueta de cuero sale del closet. Se guarda el pantalón corto. En fin, es la estación que escapa del verano, aunque tampoco hace tanto frío como en invierno. Una estación intermedia —«un tiempo entre lo que fue y vendrá»—, en donde en las hojas caídas se ve un renacer: una nueva oportunidad.
Por donde vivo hay muchos Plátanos (conocidos técnicamente como Platanus × hispanica), esos grandes árboles, esas hojas de peculiar forma, esos mismos que pueden llegar a vivir hasta 500 años (es decir, verán pasar muchas generaciones de personas más de las que yo podría incluso imaginar). En sus hojas hay algo divertido que, si observamos con atención, encontramos semejanza con la programación:
Si partimos la hoja en dos mitades vemos una simetría, aunque nunca total, sino parcial.
Algo con una brisa similar tenemos en la programación: las transformaciones. Algunas son invertibles y otras no. Las primeras son las que hablaré —por su utilidad—, pues son las que hacen perdurar la simetría.1
Si convertimos un valor real como PI (3.141592…
) en entero (o sea, 3
), no podemos volver a PI desde 3
, porque se pierde su parte decimal. No hay suficiente información. Tampoco si sumamos una lista de números enteros [2, 5, 100, 8]
podemos regresar a la lista desde el valor entero resultante (115
). Asimismo, hay muchos otros ejemplos que siguen este patrón. Sin embargo, hay otras transformaciones que si son invertibles.
Véase la siguiente Figura:
Caso (A) comienza con el valor string
“abcdef”
y pasa por varias transformaciones hasta regresar a su valor inicial (siga las flechas). Primero comienza transformando el string
en una lista de caracteres, luego los caracteres de la lista se transforman en mayúscula, el join
se aplica y vuelve a ser string
, y finalmente, se aplica una transformación que cambia todas las letras de ese string
en minúsculas. ¿Resultado? Después de cuatro transformaciones persiste la equivalencia.
Caso (B) es idéntico, no obstante, las transformaciones siguen un orden acíclico —el primer ejemplo (A) es cíclico, sigue una única dirección—, esto es, dos secuencias de transformaciones que pueden regresar al valor inicial “abcdef”
.
Ambos casos, en Python, se ven de la siguiente forma (nótese que la igualdad persiste [primordial para transformaciones invertibles]):
# Caso (A)
letras = "abcdef"
assert letras == "".join(map(lambda x: x.upper(), list(letras))).lower()
# True
# Caso (B)
letras = "abcdef"
assert letras.upper() == "".join(map(lambda x: x.upper(), list(letras)))
# True
En el primer caso, la igualdad se comprueba con el valor inicial; en el segundo caso se comprueba con otra transformación (la función upper
).
Algo interesante, y que probablemente se percató, es que las transformaciones invertibles son más fáciles y naturales de crear usando la programación funcional.2 Todas las funciones como map
, join
, upper
o lower
, se pueden expresar en términos funcionales.
Las ventajas de esto es hacer código más fácil de verificar, analizar, y menos proclive a errores, pues podemos volver a una representación anterior (o nada más diferente). En cambio, si no hay una manera de crear transformaciones que representen algo distinto: una nueva característica al software, una corrección de errores, o una simple modificación, se puede volver todo un desafío, a veces grato, la mayoría de las veces ingrato.
¿Quizá a los gatos les gusta la programación funcional? Quién sabe.
Esto es lo que en matemática se conoce como isomorfismo.
Para una introducción a la programación funcional le recomiendo leer mi artículo: https://www.researchgate.net/publication/354765192_Introduccion_a_la_programacion_funcional_usando_Haskell_y_Agda o puede considerar adquirir mi libro: Computacional y Programación funcional, publicado por la editorial Marcombo, 2021.