Die Antwort auf Ihre Frage findet sich wirklich in Reynolds 'Fabel (Abschnitt 1). Lassen Sie mich versuchen, es für Sie zu interpretieren.
In einer Sprache oder einem Formalismus, in dem Typen als Abstraktionen behandelt werden , kann eine Typvariable für jedes abstrakte Konzept stehen. Wir gehen nicht davon aus, dass Typen über eine Syntax von Typbegriffen oder eine feste Auflistung von Typoperatoren generiert werden oder dass wir zwei Typen auf Gleichheit usw. testen können. In einer solchen Sprache ist, wenn eine Funktion eine Typvariable enthält, die einzige Mit dieser Funktion können Werte dieses Typs um die angegebenen Werte gemischt werden. Es kann keine neuen Werte dieses Typs erfinden, weil es nicht "weiß", was dieser Typ ist! Das ist die intuitive Vorstellung von Parametrizität .
Dann dachte Reynolds darüber nach, wie man diese intuitive Idee mathematisch erfasst, und bemerkte das folgende Prinzip. Angenommen, wir instanziieren die Typvariable, sagen wir , in zwei verschiedenen konkreten Typen, sagen wir A und A ' , in getrennten Instantiierungen, und denken an eine Entsprechung, die R : A ↔ x ' mit R ) in Beziehung setzt . Da die Funktion dann nichts über die Typen weiß, die wir für t oder die Werte dieses Typs liefern , muss sie behandelntAA′ zwischen den beiden konkreten Typen. Dann können wir uns vorstellen, dass wir in einem Fallder Funktioneinen Wert x ∈ A geben und in dem anderen Fall einen entsprechenden Wert x ' ∈ A ' (wobei "entsprechend" bedeutet, dass x undR:A↔A′x∈Ax′∈A′xx′Rt und x ' genauso behandeln. Die Ergebnisse, die wir aus der Funktion erhalten, sollten also wieder der Beziehung R entsprechen, diewir in unserem Kopf behalten haben, dh wo immer das Element x im Ergebnis einer Instanz erscheint, muss das Element x ' in der anderen Instanz erscheinen. Daher sollteeine parametrisch polymorphe Funktion alle möglichen Beziehungskorrespondenzen zwischen möglichen Instanziierungen von Typvariablen bewahren.xx′Rxx′
Diese Idee der Aufrechterhaltung von Korrespondenzen ist nicht neu. Mathematiker wissen das schon lange. In erster Linie dachten sie, dass polymorphe Funktionen Isomorphismen zwischen Typinstanziierungen bewahren sollten. Beachten Sie, dass Isomorphismus eine Idee einer Eins-zu-Eins-Entsprechung bedeutet . Anscheinend wurden Isomorphismen ursprünglich "Homomorphismen" genannt. Dann erkannten sie, dass das, was wir heute als "Homomorphismen" bezeichnen, dh eine Vorstellung von Mehr-zu-Eins-Entsprechungen , auch erhalten bleiben würde. Eine solche Erhaltung wird als natürliche Transformation in der Kategorietheorie bezeichnet. Aber wenn wir genau darüber nachdenken, stellen wir fest, dass die Erhaltung von Homomorphismen absolut unbefriedigend ist. Die Typen und A ′AA′Wir erwähnten sind völlig willkürlich. Wenn wir abholen als A ' und A ' als A, sollten wir die gleiche Eigenschaft erhalten. Warum sollte die "Viele-zu-Eins-Entsprechung", ein asymmetrisches Konzept, eine Rolle bei der Formulierung einer symmetrischen Eigenschaft spielen? So machte Reynolds den großen Schritt der Verallgemeinerung von Homomorphismen zu logischen Beziehungen, dieviele-zu-viele-Entsprechungen sind. Die volle Wirkung dieser Verallgemeinerung ist noch nicht vollständig verstanden. Aber die zugrunde liegende Intuition ist ziemlich klar.AA′A′A
Hier gibt es noch eine weitere Feinheit. Während die Instanziierungen von Typvariablen beliebig variiert werden können, sollten konstante Typen fest bleiben. Wenn wir also die relationale Korrespondenz für einen Typausdruck sowohl mit Variablentypen als auch mit Konstantentypen formulieren, sollten wir die gewählte Relation überall dort verwenden, wo die Typvariable auftritt, und die Identitätsrelation I K überall dort, wo ein Konstantentyp K auftritt. Zum Beispiel ist die Beziehung Ausdruck für den Typ t × I n t → I n t × t wäre R × I I n t → I IRIKKt×Int→Int×t. Wenn alsofeine Funktion dieses Typs ist, sollte es ein Paar(x,n)und ein verwandtes( x ' ,n)auf ein Paar(m,x)und ein verwandtes(m, x ' )abbilden.R×IInt→IInt×Rf(x,n)(x′,n)(m,x)(m,x′) . Beachten Sie, dass wir die Funktion testen müssen, indem wir in beiden Fällen dieselben Werte für konstante Typen eingeben, und dass wir in den Ausgaben garantiert dieselben Werte für konstante Typen erhalten. Bei der Formulierung relationaler Korrespondenzen für Typausdrücke sollten wir sicherstellen, dass wir durch das Einfügen von Identitätsbeziehungen (die die Vorstellung vertreten, dass diese Typen konsistent sein werden) Identitätsbeziehungen zurückerhalten, dh . Dies ist die entscheidendeIdentitätserweiterungF(IA1,…,IAn)=IF(A1,…,An) Eigentum.
Um die Parametrizität intuitiv zu verstehen, müssen Sie lediglich einige Beispielfunktionstypen auswählen, sich überlegen, welche Funktionen mit diesen Typen ausgedrückt werden können, und überlegen, wie sich diese Funktionen verhalten, wenn Sie verschiedene Instanziierungen von Typvariablen und unterschiedliche Werte von diesen einfügen Instanziierungstypen. Lassen Sie mich einige Funktionstypen vorschlagen, um Ihnen den Einstieg zu erleichtern: , 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)