La respuesta a su pregunta está realmente en la fábula de Reynolds (Sección 1). Déjame intentar interpretarlo por ti.
En un lenguaje o formalismo en el que los tipos se tratan como abstracciones , una variable de tipo puede representar cualquier concepto abstracto. No asumimos que los tipos se generan a través de una sintaxis de términos de tipo, o una colección fija de operadores de tipo, o que podemos probar la igualdad de dos tipos, etc. En dicho lenguaje, si una función involucra una variable de tipo, entonces el único Lo que la función puede hacer a los valores de ese tipo es barajar los valores que se le han dado. ¡No puede inventar nuevos valores de ese tipo, porque no "sabe" qué es ese tipo! Esa es la idea intuitiva de la parametricidad .
Entonces Reynolds pensó en cómo capturar matemáticamente esta idea intuitiva, y notó el siguiente principio. Supongamos que instanciamos la variable de tipo, digamos , a dos tipos concretos diferentes, digamos A y A ' , en instancias separadas, y tenemos en mente alguna correspondencia R : A ↔ A ' entre los dos tipos concretos. Entonces podemos imaginar que, en un caso, proporcionamos un valor x ∈ A a la función y, en el otro caso, un valor correspondiente x ′ ∈ A ′ (donde "correspondiente" significa que x xtUNUN′R : A ↔ A′x ∈ AX′∈ A′X y están relacionados por R ). Entonces, dado que la función no sabe nada sobre los tipos que estamos suministrando para t o los valores de ese tipo, tiene que tratar x y x ' exactamente de la misma manera. Entonces, los resultados que obtenemos de la función deben corresponder nuevamente por la relación R que hemos tenido en mente, es decir, donde sea que el elemento x aparezca en el resultado de una instancia, el elemento x ' debe aparecer en la otra instancia. Por lo tanto,una función polimórfica paramétrica debe preservar todas las correspondencias relacionales posibles entre posibles instancias de variables de tipo.X′RtXX′RXX′
Esta idea de preservación de correspondencias no es nueva. Los matemáticos lo saben desde hace mucho tiempo. En primera instancia, pensaron que las funciones polimórficas deberían preservar los isomorfismos entre las instancias de tipo. Tenga en cuenta que el isomorfismo significa alguna idea de una correspondencia uno a uno . Aparentemente, los isomorfismos fueron originalmente llamados "homomorfismos". Luego se dieron cuenta de que lo que ahora llamamos "homomorfismos", es decir, alguna idea de correspondencias de muchos a uno , también se conservaría. Tal preservación se conoce con el nombre de transformación natural en la teoría de categorías. Pero, si lo pensamos profundamente, nos damos cuenta de que la preservación de los homomorfismos es completamente insatisfactoria. Los tipos y A 'UNUN′que mencionamos son completamente arbitrarios. Si elegimos como A ' y A ' como A , deberíamos obtener la misma propiedad. Entonces, ¿por qué la "correspondencia de muchos a uno", un concepto asimétrico, desempeña un papel en la formulación de una propiedad simétrica? Por lo tanto, Reynolds dio el gran paso de generalizar de los homomorfismos a las relaciones lógicas, que son correspondencias de muchos a muchos . El impacto total de esta generalización aún no se comprende completamente. Pero la intuición subyacente es bastante clara.UNUN′UN′UN
Hay una sutileza más aquí. Mientras que las instancias de las variables de tipo pueden variar arbitrariamente, los tipos constantes deben permanecer fijos. Entonces, cuando formulamos la correspondencia relacional para una expresión de tipo tanto con tipos variables como con tipos constantes, debemos usar la relación elegida siempre que aparezca la variable tipo y la relación de identidad I K donde aparezca un tipo constante K. Por ejemplo, la expresión de relación para el tipo t × I n t → I n t × t sería R × I I n t → I IRyoKKt × In t → In t × t. Así pues, sifes una función de este tipo, se debe asignar un par(x,n)y una relacionada( x ' ,n)para algún par(m,x)y relacionado(m, x ' )R × Iyon t→ Iyon t× RF( x , n )( x′, n )( m , x )( m , x′). Tenga en cuenta que estamos obligados a probar la función poniendo los mismos valores para los tipos constantes en los dos casos, y estamos garantizados para obtener los mismos valores para los tipos constantes en las salidas. Por lo tanto, al formular correspondencias relacionales para expresiones de tipo, debemos asegurarnos de que, al conectar las relaciones de identidad (que representan la idea de que esos tipos van a ser constantes), recuperamos las relaciones de identidad, es decir, . Esta es la extensión de identidad crucialF( YoUN1, ... , yoUNnorte) = IF( A1, ... , Anorte) propiedad.
Para entender la parametridad intuitivamente, todo lo que necesita hacer es elegir algunos tipos de funciones de muestra, pensar qué funciones se pueden expresar de esos tipos y pensar cómo se comportan esas funciones si conecta diferentes instancias de variables de tipo y diferentes valores de esos tipos de instanciación. Permítame sugerirle algunos tipos de funciones para comenzar: , t → I n t , I n t → t , t × t → t × t , ( t → t ) → t , ( tt → tt → In tyon t → tt × t → t × t( t → t ) → t .( t → t ) → ( t → t )