Παραμετρικός πολυμορφισμός

Στις γλώσσες προγραμματισμού και στη θεωρία τύπων, ο παραμετρικός πολυμορφισμός είναι ένας τρόπος να κάνουμε μια γλώσσα πιο εκφραστική, διατηρώντας ταυτόχρονα την στατική ασφάλεια τύπων. Χρησιμοποιώντας παραμετρικό πολυμορφισμό, μία συνάρτηση ή ένας τύπος δεδομένων μπορεί να γραφεί γενικά ώστε να χειρίζεται πανομοιότυπα τις τιμές ανεξάρτητα από τον τύπο τους. Τέτοιες συναρτήσεις και τύποι δεδομένων ονομάζονται γενικές συναρτήσεις και γενικοί τύποι δεδομένων αντίστοιχα και σχηματίζουν τη βάση του γενικού προγραμματισμού.
Για παράδειγμα, μία συνάρτηση append η οποία συνενώνει δύο λίστες μπορεί να κατασκευαστεί έτσι ώστε να μην νοιάζεται για των τύπο των στοιχείων της λίστας: μπορεί να συνενώσει λίστες ακεραίων, λίστες πραγματικών αριθμών, λίστες συμβολοσειρών κτλ. Έστω ότι η μεταβλητή τύπου a δηλώνει τον τύπο των στοιχείων της λίστας. Τότε η append έχει τύπο [a] × [a] → [a], όπου [a] δηλώνει τον τύπο της λίστας από στοιχεία τύπου a. Λέμε ότι ο τύπος της append είναι παραμετρικός με παράμετρο το a για όλες τις τιμές του a. (Σημειώστε ότι αφού υπάρχει μόνο μία μεταβλητή τύπου, η συνάρτηση δεν μπορεί να εφαρμοστεί σε οποιοδήποτε ζευγάρι λιστών: το ζευγάρι λιστών καθώς επίσης και το αποτέλεσμα, πρέπει να αποτελείται από στοιχεία του ίδιου τύπου.) Οπουδήποτε εφαρμόζεται η συνάρτηση append, αποφασίζεται μία τιμή για το a.
Σύμφωνα με τον Christopher Strachey, ο παραμετρικός πολυμορφισμός μπορεί να αντιπαρατεθεί με τον πολυμορφισμό ad-hoc, ο οποίος ονομάζεται και υπερφόρτωση, και στον οποίο μια πολυμορφική συνάρτηση μπορεί να έχει ένα πλήθος διακριτών και ίσως και ετερογενών υλοποιήσεων ανάλογα με τον τύπο των παραμέτρων στις οποίες εφαρμόζεται. Ως εκ τούτου, ο πολυμορφισμός ad-hoc polymorphism μπορεί γενικά να υποστηρίξει μόνο έναν περιορισμένο αριθμό διακριτών τύπων, καθώς πρέπει να παρέχεται ξεχωριστή υλοποίηση για κάθε τύπο.

Ιστορία

Ο παραμετρικός πολυμορφισμός εισήχθη για πρώτη φορά στις γλώσσες προγραμματισμού στην ML τo 1976. Σήμερα υπάρχει στις Standard ML, OCaml, Ada, Haskell, Visual Prolog και άλλες. Οι γλώσσες Java, C#, Visual Basic .NET και Delphi (CodeGear) πρόσφατα εισήγαγαν, η κάθε μια ξεχωριστά, το χαρακτηριστικό των "generics", για παραμετρικό πολυμορφισμό. Κάποιες υλοποιήσεις του πολυμορφισμού τύπων είναι επιφανειακά όμοιες με τον παραμετρικό πολυμορφισμό καθώς εισάγουν πτυχές ad-hoc. Ένα παράδειγμα είναι η εξειδίκευση προτύπων της C++.
Η πιο γενική μορφή πολυμορφισμού είναι ο μη κατηγορηματικός πολυμορφισμός υψηλής τάξης. Δύο δημοφιλείς περιορισμοί αυτής της μορφής είναι ο πολυμορφισμός περιορισμένης τάξης(για παράδειγμα, βαθμού-1 ή πολυμορφισμός prenex) και ο κατηγορηματικός πολυμορφισμός. Μαζί αυτοί οι δύο περιορισμοί δίνουν τον "κατηγορηματικό πολυμορφισμό prenex", ο οποίος είναι στην ουσία η μορφή πολυμορφισμού που βρίσκεται στην ML και σε κάποιες πρώτες εκδόσεις της Haskell.

Περιορισμένος παραμετρικός πολυμορφισμός

Ο Luca Cardelli και ο Wegner αναγνώρισαν το 1985 τα πλεονεκτήματα των περιορισμών στις παραμέτρους τύπων. Πολλές λειτουργίες απαιτούν κάποια γνώση των τύπων δεδομένων αλλά μπορούν σε αντίθετη περίπτωση να δουλέψουν παραμετρικά. Για παράδειγμα, για να ελέγξουμε αν ένα αντικείμενο περιλαμβάνεται σε μία λίστα χρειάζεται να συγκρίνουμε τα αντικείμενα για ισότητα. Στην Standard ML, οι παράμετροι τύπων της μορφής ’’a είναι περιορισμένοι έτσι ώστε να είναι διαθέσιμη η λειτουργία της ισότητας, ως εκ τούτου η συνάρτηση θα είχε τον τύπο ’’a × ’’a list → bool και το ’’a μπορεί να είναι μόνο ένας τύπος με την ισότητα ορισμένη. Στην Haskell, o περιορισμός επιτυγχάνεται απαιτώντας οι τύποι να ανήκουν σε μία κλάση τύπου. Ως εκ τούτου η ίδια συνάρτηση έχει τον τύπο  στην Haskell. Στις περισσότερες αντικειμενοστραφείς γλώσσες προγραμματισμού που υποστηρίζουν παραμετρικό πολυμορφισμό, οι παράμετροι μπορούν να περιοριστούν ώστε να είναι υποτύποι κάποιου τύπου (δείτε Πολυμορφισμός υποτύπων και το άρθρο Generic programming).