Piensa en los funtores como estructuras de datos. Como en la programación los tipos de "colección" son functores. La elección del tipo de datos que contiene la colección corresponde a la elección del objeto en las categorías del funtor. Así, la colección puede contener cualquier tipo de datos ["contenido"]. Pero la "estructura" de la misma está fijada por el tipo de la colección, es decir, por el functor.
Un ejemplo de tipo de colección [functor] es Par homogéneo [X * X]. Pasemos a los Pares heterogéneos [X * Y]. Este tiene 2 parámetros de tipo elemento, por lo que no puede ser un functor. Pero si fijamos uno de ellos, entonces sólo queda un parámetro y tal construcción de datos de Pares es un functor. Así, X * C es un functor en X para toda elección constante de C.
Y obviamente también lo es C * X. X * C y C * X no son los mismos funtores. Se sienten como si fueran el mismo, pero no lo son. Sólo son isomorfos.
¿Puedes pensar en una función invertible que atestigüe este isomorfismo? Por supuesto, es trivial. Aquí está la parte divertida: sé en cuál piensas: la que invierte el orden de los componentes en la estructura de pares. ¿Cómo lo sé? Es una opción "natural" y en este ejemplo concreto es la única opción. Te has visto limitado por no saber qué son concretamente X y C. Sólo conocías las estructuras de las colecciones, por lo que sólo podías encontrar una solución que relacionara las estructuras, independientemente de lo que fueran los contenidos. Esta independencia es la "naturalidad".
La "independencia" no es lo suficientemente rigurosa para una definición matemática. Una reformulación : 2 aspectos son independientes si ambos pueden variar libremente sin interferir con el otro. "interferir" está todavía lejos del rigor, pero a partir de él puedo desarrollar algo riguroso a través de un buen ejemplo concreto : los hilos en los programas de ordenador. La programación de los hilos es no determinista, así que desde el punto de vista del programador : 2 hilos no interfieren entre sí si producen resultados|efectos correctos para todas las programaciones posibles. Con más rigor : si para 2 instrucciones cualesquiera {i1, i2} [de hilos diferentes] : su orden de ejecución relativo no importa, es decir, si i1;i2 tiene el mismo comportamiento que i2;i1. Podemos trasladar esta imagen a las matemáticas pensando en las instrucciones como endofunciones en el espacio de estados del programa. Entonces la condición es : si la [función-]composición de las funciones mutantes del espacio de estados [de diferentes hilos] es conmutativa. Y esto es exactamente lo que dice la definición de isomorfismo natural con su diagrama conmutativo : 2 cambios de los 2 aspectos diferentes [(transición entre objetos dentro de la categoría) y (transición entre los funtores], pueden ocurrir en cualquier orden, el resultado debe ser el mismo. Para apoyar aún más la intuición : volver a la vista del functor como estructura de datos. En ella la naturalidad dice : no importa si (cambiamos primero el contenido y luego la estructura) o (cambiamos primero la estructura y luego el contenido). Más concretamente en mi anterior ejemplo de par heterogéneo : no importa si (cambiamos primero el contenido del componente "X" del par y luego el orden de los 2 componentes) o (cambiamos primero el orden de los 2 componentes y luego el contenido del componente "X").
La naturalidad en la "transformación natural" y el "isomorfismo natural" es la misma propiedad. La diferencia entre las dos nociones está en los componentes de las mismas: una transformación es cualquier función, un isomorfismo debe ser invertible.
Datos de interés sobre la naturalidad :
- Su importancia queda bien insinuada por el hecho de que la propia teoría de las categorías, como campo de las matemáticas, se descubrió para poder definirla. El functor fue la solución para definir la naturalidad. La categoría fue la solución para definir el functor.
- En la programación, la naturalidad se produce de forma natural, es decir, sin ningún esfuerzo directo por parte del programador. Por el fenómeno que en programación se denomina "parametricidad", que significa que el comportamiento de una función polimórfica de tipo es uniforme para todas las instancias concretas de su variable de tipo.