La réponse à votre question est vraiment là dans la fable de Reynolds (Section 1). Laissez-moi essayer de l'interpréter pour vous.
Dans un langage ou un formalisme dans lequel les types sont traités comme des abstractions , une variable de type peut représenter n'importe quel concept abstrait. Nous ne supposons pas que les types sont générés via une syntaxe de termes de type, ou une collection fixe d'opérateurs de type, ou que nous pouvons tester deux types pour l'égalité, etc. Dans un tel langage, si une fonction implique une variable de type, alors la seule chose que la fonction peut faire pour les valeurs de ce type est de mélanger autour des valeurs qui lui ont été données. Il ne peut pas inventer de nouvelles valeurs de ce type, car il ne "sait" pas ce qu'est ce type! Telle est l'idée intuitive de la paramétricité .
Ensuite, Reynolds a réfléchi à la façon de capturer mathématiquement cette idée intuitive et a remarqué le principe suivant. Supposons que nous instancions la variable de type, disons , en deux types de béton différents, disons A et A ′ , dans des instanciations distinctes, et gardons dans notre esprit une correspondance R : A ↔ A ′ entre les deux types de béton. Ensuite, nous pouvons imaginer que, dans un cas, nous fournissons une valeur x ∈ A à la fonction et, dans l'autre cas, une valeur correspondante x ′ ∈ A ′ (où "correspondant" signifie que x ettAA′R:A↔A′x∈Ax′∈A′x sont liés par Rnous avons gardée à l'esprit, c'est-à-dire que partout où l'élément x apparaît dans le résultat d'une instance, l'élément x ' doit apparaître dans l'autre instance. Ainsi,une fonction paramétriquement polymorphe devrait conserver toutes les correspondances relationnelles possibles entre les instanciations possibles des variables de type.x′R). Ensuite, puisque la fonction ne sait rien des types que nous fournissons pour ou des valeurs de ce type, elle doit traiter x et x ′ exactement de la même manière. Ainsi, les résultats que nous obtenons de la fonction devraient à nouveau correspondre par la relation Rtxx′Rxx′
Cette idée de conservation des correspondances n'est pas nouvelle. Les mathématiciens le savent depuis longtemps. Dans un premier temps, ils pensaient que les fonctions polymorphes devraient préserver les isomorphismes entre les instanciations de type. Notez que l'isomorphisme signifie qu'une idée de ce que nous avons mentionné est complètement arbitraire. Si nous choisissons A comme A ′ et correspondance biunivoque . Apparemment, les isomorphismes étaient à l'origine appelés "homomorphismes". Ils ont alors réalisé que ce que nous appelons maintenant les "homomorphismes", c'est -à- dire une idée des correspondances plusieurs-à-un , serait également préservé. Une telle conservation porte le nom de transformation naturelle dans la théorie des catégories. Mais, si nous y réfléchissons attentivement, nous nous rendons compte que la préservation des homomorphismes est totalement insatisfaisante. Les types et A ′AA′AA′ comme A , nous devrions obtenir la même propriété. Alors, pourquoi la "correspondance plusieurs-à-un", un concept asymétrique, devrait-elle jouer un rôle dans la formulation d'une propriété symétrique? Ainsi, Reynolds a fait le grand pas de la généralisation des homomorphismes aux relations logiques, qui sont des correspondancesplusieurs à plusieurs. Le plein impact de cette généralisation n'est pas encore pleinement compris. Mais l'intuition sous-jacente est assez claire.A′A
Il y a une autre subtilité ici. Alors que les instanciations des variables de type peuvent varier arbitrairement, les types constants doivent rester fixes. Ainsi, lorsque nous formulons la correspondance relationnelle pour une expression de type avec à la fois des types variables et des types constants, nous devons utiliser la relation choisie partout où la variable type apparaît et la relation d'identité I K partout où un type constant K apparaît. Par exemple, l'expression de relation pour le type t × I n t → I n t × t serait R × I I n t → I IRIKKt×Int→Int×t. Donc, sifest une fonction de ce type, il devrait mapper une paire(x,n)et une parenté( x ′ ,n)à une paire(m,x)et apparentée(m, x ′ )R×IInt→IInt×Rf(x,n)(x′,n)(m,x)(m,x′). Notez que nous sommes obligés de tester la fonction en mettant les mêmes valeurs pour les types constants dans les deux cas, et nous sommes garantis d'obtenir les mêmes valeurs pour les types constants dans les sorties. Ainsi, en formulant des correspondances relationnelles pour les expressions de type, nous devons nous assurer qu'en branchant les relations d'identité (représentant l'idée que ces types vont être consentants), nous récupérons les relations d'identité, c'est-à-dire . Ceci est l' extension d'identité crucialeF(IA1,…,IAn)=IF(A1,…,An) propriété.
Pour comprendre la paramétricité de manière intuitive, tout ce que vous avez à faire est de sélectionner quelques types de fonctions d'échantillonnage, de réfléchir aux fonctions qui peuvent être exprimées de ces types et de réfléchir au comportement de ces fonctions si vous branchez différentes instanciations de variables de type et différentes valeurs de celles-ci. types d'instanciation. Permettez-moi de suggérer quelques types de fonctions pour commencer: , t → I n t , I n t → t , t × t → t × t , ( t → t ) → t , ( tt→tt→IntInt→tt×t→t×t(t→t)→t .(t→t)→(t→t)