A resposta para sua pergunta está realmente na fábula de Reynolds (Seção 1). Deixe-me tentar interpretá-lo para você.
Em uma linguagem ou formalismo em que os tipos são tratados como abstrações , uma variável de tipo pode representar qualquer conceito abstrato. Não assumimos que os tipos sejam gerados por meio de alguma sintaxe dos termos de tipo, ou de uma coleção fixa de operadores de tipo, ou que possamos testar dois tipos quanto à igualdade, etc. Nesse idioma, se uma função envolver uma variável de tipo, o único a coisa que a função pode fazer com valores desse tipo é embaralhar os valores que ela recebeu. Ele não pode inventar novos valores desse tipo, porque não "sabe" o que é esse tipo! Essa é a ideia intuitiva da parametridade .
Então Reynolds pensou em como capturar matematicamente essa ideia intuitiva e percebeu o seguinte princípio. Suponha que instanciar a variável do tipo, digamos , a dois tipos de concreto diferentes, dizem A e A ' , em instâncias separadas, e se manter em nossa mente alguma correspondência R : A ↔ A ' entre os dois tipos de concreto. Então, podemos imaginar que, em um caso, forneçamos um valor x ∈ A à função e, no outro caso, um valor correspondente x ′ ∈ A ′ (onde "correspondente" significa que x etUMAUMA′R : A ↔ A′x ∈ Ax′∈ A′x são relacionados por R ). Então, como a função não sabe nada sobre os tipos que estamos fornecendo para t ou os valores desse tipo, ela deve tratar x e x ' exatamente da mesma maneira. Portanto, os resultados que obtemos da função devem corresponder novamente à relação R que mantemos em nossa mente, ou seja, sempre que o elemento x aparece no resultado de uma instância, o elemento x ' deve aparecer na outra instância. Assim,uma função parametricamente polimórfica deve preservar todas as correspondências relacionais possíveis entre instâncias possíveis de variáveis de tipo.x′Rtxx′Rxx′
Essa ideia de preservação de correspondências não é nova. Os matemáticos sabem disso há muito tempo. Em um primeiro momento, eles pensaram que funções polimórficas deveriam preservar isomorfismos entre instanciações de tipo. Observe que isomorfismo significa alguma idéia de uma correspondência individual . Aparentemente, os isomorfismos foram originalmente chamados de "homomorfismos". Então eles perceberam que o que agora chamamos de "homomorfismos", isto é, alguma idéia de correspondências muitos-para-um , também seria preservado. Essa preservação tem o nome de transformação natural na teoria das categorias. Mas, se pensarmos profundamente, perceberemos que a preservação de homomorfismos é totalmente insatisfatória. Os tipos e A ′UMAUMA′nós mencionamos são completamente arbitrários. Se escolhermos como A ' e A ' como A , devemos obter a mesma propriedade. Então, por que a "correspondência muitos-para-um", um conceito assimétrico, deve desempenhar um papel na formulação de uma propriedade simétrica? Assim, Reynolds deu o grande passo de generalizar dos homomorfismos para as relações lógicas, que são correspondências muitos para muitos . O impacto total dessa generalização ainda não está totalmente esclarecido. Mas a intuição subjacente é bastante clara.UMAUMA′UMA′UMA
Há mais uma sutileza aqui. Enquanto as instanciações das variáveis de tipo podem ser arbitrariamente variadas, os tipos constantes devem permanecer fixos. Portanto, quando formulamos a correspondência relacional para uma expressão de tipo com tipos de variáveis e tipos constantes, devemos usar a relação escolhida sempre que a variável de tipo aparecer e a relação de identidade I K sempre que um tipo constante de K aparecer. Por exemplo, a expressão de relação para o tipo t × I n t → I n t × t seria R × I I n t → I IREuKKt × In t → In t × tR × IEun t→ euEun t× Rf( x , n )( x′, N )( m , x )( m , x′). Observe que somos obrigados a testar a função colocando os mesmos valores para tipos constantes nos dois casos, e garantimos que obtemos os mesmos valores para tipos constantes nas saídas. Portanto, ao formular correspondências relacionais para expressões de tipo, devemos garantir que, inserindo relações de identidade (representando a ideia de que esses tipos serão consentidos), recuperemos relações de identidade, ou seja, . Esta é a extensão de identidade crucialF( EuUMA1, ... , IUMAn) = IF( A1, … , An) propriedade.
Para entender a parametridade intuitivamente, tudo o que você precisa fazer é escolher alguns tipos de funções da amostra, pensar em quais funções podem ser expressas desses tipos e pensar em como essas funções se comportam se você conectar instâncias diferentes de variáveis de tipo e valores diferentes daquelas tipos de instanciação. Deixe-me sugerir alguns tipos de funções para você começar: , t → I n t , i n t → t , t × t → t × t , ( t → t ) → t , ( tt → tt → In tEun t → tt × t → t × t( t → t ) → t .( t → t ) → ( t → t )