(Translated by https://www.hiragana.jp/)
Παραμετρικός πολυμορφισμός - Βικιπαίδεια Μετάβαση σしぐまτたうοおみくろん περιεχόμενο

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

Από τたうηいーた Βικιπαίδεια, τたうηいーたνにゅー ελεύθερη εγκυκλοπαίδεια

Στις γλώσσες προγραμματισμού κかっぱαあるふぁιいおた σしぐまτたうηいーた θεωρία τύπων, οおみくろん παραμετρικός πολυμορφισμός είναι ένας τρόπος νにゅーαあるふぁ κάνουμε μみゅーιいおたαあるふぁ γλώσσα πぱいιいおたοおみくろん εκφραστική, διατηρώντας ταυτόχρονα τたうηいーたνにゅー στατική ασφάλεια τύπων. Χρησιμοποιώντας παραμετρικό πολυμορφισμό, μία συνάρτηση ή ένας τύπος δεδομένων μπορεί νにゅーαあるふぁ γραφεί γενικά ώστε νにゅーαあるふぁ χειρίζεται πανομοιότυπα τις τιμές ανεξάρτητα από τたうοおみくろんνにゅー τύπο τους[1]. Τέτοιες συναρτήσεις κかっぱαあるふぁιいおた τύποι δεδομένων ονομάζονται γενικές συναρτήσεις κかっぱαあるふぁιいおた γενικοί τύποι δεδομένων αντίστοιχα κかっぱαあるふぁιいおた σχηματίζουν τたうηいーた βάση τたうοおみくろんυうぷしろん γενικού προγραμματισμού.

Γがんまιいおたαあるふぁ παράδειγμα, μία συνάρτηση 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.

Πολυμορφισμός υψηλής τάξης

[Επεξεργασία | επεξεργασία κώδικα]
Τάξης-1 (prenex) πολυμορφισμός
Σしぐまεいぷしろん ένα prenex πολυμορφικό σύστημα, οおみくろんιいおた μεταβλητές τύπων δでるたεいぷしろんνにゅー πρέπει νにゅーαあるふぁ αρχικοποιούνται σしぐまεいぷしろん κάποιον πολυμορφικό τύπο. Αυτό μοιάζει πολύ μみゅーεいぷしろん αυτό πぱいοおみくろんυうぷしろん λέγεται "ML-style" ή "Let-πολυμορφισμός" (τεχνικά μιλώντας οおみくろん Let-πολυμορφισμός της ML έχει μερικούς ακόμα συντακτικούς περιορισμούς).
Αυτός οおみくろん περιορισμός κάνει τたうηいーたνにゅー διαφορά ανάμεσα στους πολυμορφικούς κかっぱαあるふぁιいおた στους μみゅーηいーた πολυμορφικούς τύπους πολύ σημαντική! Ως εいぷしろんκかっぱ τούτου σしぐまτたうαあるふぁ κατηγορηματικά συστήματα οおみくろんιいおた πολυμορφικοί τύποι αναφέρονται μερικές φορές κかっぱαあるふぁιいおた ως σχήματα τύπων γがんまιいおたαあるふぁ νにゅーαあるふぁ τους διακρίνουμε από τους συνήθεις (μονομορφικούς) τύπους, οおみくろんιいおた οποίοι μερικές φορές καλούνται μονοτύποι'. Μία συνέπεια αυτού είναι ότι όλοι οおみくろんιいおた τύποι μπορούν νにゅーαあるふぁ γραφούν σしぐまεいぷしろん μみゅーιいおたαあるふぁ μορφή σしぐまτたうηいーたνにゅー οποία όλοι οおみくろんιいおた ποσοδείκτες βρίσκονται σしぐまτたうηいーたνにゅー πぱいιいおたοおみくろん εξωτερική (prenex) θέση.
Γがんまιいおたαあるふぁ παράδειγμα, θεωρήστε τたうηいーたνにゅー συνάρτηση append πぱいοおみくろんυうぷしろん περιγράφηκε παραπάνω, ηいーた οποία έχει τύπο [a] × [a] → [a]! Γがんまιいおたαあるふぁ νにゅーαあるふぁ εφαρμόσει κανείς τたうηいーたνにゅー συνάρτηση αυτή σしぐまεいぷしろん ένα ζευγάρι λιστών, ηいーた μεταβλητή τύπου a σしぐまτたうοおみくろんνにゅー τύπο της συνάρτησης πρέπει νにゅーαあるふぁ αντικατασταθεί μみゅーεいぷしろん έναν τύπο τέτοιον ώστε οおみくろん τύπος τたうωおめがνにゅー ορισμάτων της συνάρτησης νにゅーαあるふぁ ταιριάζει μみゅーεいぷしろん τたうοおみくろんνにゅー τύπο τたうοおみくろんυうぷしろん αποτελέσματος της. Σしぐまεいぷしろん ένα μみゅーηいーた κατηγορηματικό σύστημα, οおみくろん τύπος πぱいοおみくろんυうぷしろん αντικαθίσταται μπορεί νにゅーαあるふぁ οποιοσδήποτε τύπος, συμπεριλαμβανομένου κかっぱαあるふぁιいおた κάποιου τύπου πぱいοおみくろんυうぷしろん είναι κかっぱαあるふぁιいおた οおみくろん ίδιος πολυμορφικός; ως εいぷしろんκかっぱ τούτου ηいーた append μπορεί νにゅーαあるふぁ εφαρμοστεί σしぐまεいぷしろん ζευγάρια λιστών οποιουδήποτε τύπου- ακόμα κかっぱαあるふぁιいおた σしぐまεいぷしろん λίστες πολυμορφικών συναρτήσεων όπως είναι κかっぱαあるふぁιいおた σしぐまτたうηいーたνにゅー ίδια τたうηいーたνにゅー append.
Οおみくろん πολυμορφισμός σしぐまτたうηいーたνにゅー γλώσσα ML καθώς επίσης κかっぱαあるふぁιいおた στις συγγενικές της είναι κατηγορηματικός. Αυτό συμβαίνει διότι ηいーた κατηγορηματικότητα, μαζί μみゅーεいぷしろん άλλους περιορισμούς, κάνει τたうοおみくろん σύστημα τύπων αρκετά απλό ώστε νにゅーαあるふぁ γίνει δυνατή ηいーた εξαγωγή τύπων. Στις γλώσσες προγραμματισμού στις οποίες είναι απαραίτητη ηいーた ρητή επισημείωση τύπων όταν εφαρμόζουμε μία πολυμορφική συνάρτηση, οおみくろん περιορισμός τたうηいーたνにゅー κατηγορηματικότητας είναι λιγότερο σημαντικός. Ως εいぷしろんκかっぱ τούτου αυτές οおみくろんιいおた γλώσσες είναι γενικά μみゅーηいーた κατηγορηματικές. Ηいーた Haskell επιτυγχάνει νにゅーαあるふぁ κάνει εξαγωγή τύπων χωρίς τたうηいーたνにゅー κατηγορηματικότητα αλλά μみゅーεいぷしろん μερικές επιπλοκές.
Πολυμορφισμός τάξης-k
Γがんまιいおたαあるふぁ κάποια προκαθορισμένη τιμή k, πολύμορφισμός τάξης-k είναι ένα σύστημα σしぐまτたうοおみくろん οποίο ένας ποσοδείκτης δでるたεいぷしろんνにゅー πρέπει νにゅーαあるふぁ εμφανίζεται σしぐまτたうαあるふぁ αριστερά k ή περισσοτέρων δεικτών(όταν οおみくろん τύπος απεικονίζεται ως δέντρο).[1]
Ηいーた Εξαγωγή τύπων γがんまιいおたαあるふぁ πολυμορφισμός τάξης-2 είναι αποφάσιμη, αλλά ηいーた ανακατασκευή γがんまιいおたαあるふぁ τάξη-3 κかっぱαあるふぁιいおた πάνω δでるたεいぷしろんνにゅー είναι.[1]
Πολυμορφισμός τάξης-n ("υψηλής τάξης")
Πολυμορφισμός τάξης-n είναι οおみくろん πολυμορφισμός σしぐまτたうοおみくろんνにゅー οποίο οおみくろんιいおた ποσοδείκετες μπορούν νにゅーαあるふぁ εμφανίζονται σしぐまτたうαあるふぁ αριστερά ενός αυθαίρετου αριθμού δεικτών.

Κατηγορηματικός κかっぱαあるふぁιいおた μみゅーηいーた κατηγορηματικός πολυμορφισμός

[Επεξεργασία | επεξεργασία κώδικα]
Κατηγορηματικός πολυμορφισμός
Σしぐまτたうοおみくろんνにゅー ένα σύστημα παραμετρικού κατηγορηματικού πολυμορφισμού, ένας τύπος πぱいοおみくろんυうぷしろん περιέχει μία μεταβλητή τύπου δでるたεいぷしろんνにゅー πρέπει νにゅーαあるふぁ χρησιμοποιείται μみゅーεいぷしろん τρόπο ώστε τたうοおみくろん νにゅーαあるふぁ είναι πολυμορφικό τύπος.
Μみゅーηいーた κατηγορηματικό πολυμορφισμός (πολυμορφισμός "πρώτης κλάσης")
Καλείται επίσης κかっぱαあるふぁιいおた πολυμορφισμός πρώτης τάξης. Οおみくろん μみゅーηいーた κατηγορηματικό πολυμορφισμός επιτρέπει μみゅーιいおたαあるふぁ μεταβλητή σしぐまεいぷしろん έναν τύπο νにゅーαあるふぁ έχει οποιονδήποτε τύπο, συμπεριλαμβανομένων κかっぱαあるふぁιいおた πολυμορφικών τύπων, όπως κかっぱαあるふぁιいおた τたうοおみくろん ίδιο .
Σしぐまτたうηいーたνにゅー θεωρία τύπων, οおみくろんιいおた πぱいιいおたοおみくろん συχνά μελετούμενοι μみゅーηいーた κατηγορηματικοί λらむだ-λογισμοί μみゅーεいぷしろん τύπους, στηρίζονται σしぐまτたうοおみくろんνにゅー λάμδα κύβο, ιδιαίτερα σしぐまτたうοおみくろん σύστημα F. Οおみくろんιいおた θεωρίες κατηγορηματικών τύπων περιλαμβάνουν τたうηいーたνにゅー θεωρία τύπων Martin-Löf κかっぱαあるふぁιいおた τたうηいーたνにゅー NuPRL.

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

[Επεξεργασία | επεξεργασία κώδικα]

Οおみくろん Luca Cardelli κかっぱαあるふぁιいおた οおみくろん Wegner αναγνώρισαν τたうοおみくろん 1985 τたうαあるふぁ πλεονεκτήματα τたうωおめがνにゅー περιορισμών στις παραμέτρους τύπων.[2] Πολλές λειτουργίες απαιτούν κάποια γνώση τたうωおめがνにゅー τύπων δεδομένων αλλά μπορούν σしぐまεいぷしろん αντίθετη περίπτωση νにゅーαあるふぁ δουλέψουν παραμετρικά. Γがんまιいおたαあるふぁ παράδειγμα, γがんまιいおたαあるふぁ νにゅーαあるふぁ ελέγξουμε αあるふぁνにゅー ένα αντικείμενο περιλαμβάνεται σしぐまεいぷしろん μία λίστα χρειάζεται νにゅーαあるふぁ συγκρίνουμε τたうαあるふぁ αντικείμενα γがんまιいおたαあるふぁ ισότητα. Σしぐまτたうηいーたνにゅー Standard ML, οおみくろんιいおた παράμετροι τύπων της μορφής ’’a είναι περιορισμένοι έτσι ώστε νにゅーαあるふぁ είναι διαθέσιμη ηいーた λειτουργία της ισότητας, ως εいぷしろんκかっぱ τούτου ηいーた συνάρτηση θしーたαあるふぁ είχε τたうοおみくろんνにゅー τύπο ’’a × ’’a list → bool κかっぱαあるふぁιいおた τたうοおみくろん ’’a μπορεί νにゅーαあるふぁ είναι μόνο ένας τύπος μみゅーεいぷしろん τたうηいーたνにゅー ισότητα ορισμένη. Σしぐまτたうηいーたνにゅー Haskell, o περιορισμός επιτυγχάνεται απαιτώντας οおみくろんιいおた τύποι νにゅーαあるふぁ ανήκουν σしぐまεいぷしろん μία κλάση τύπου. Ως εいぷしろんκかっぱ τούτου ηいーた ίδια συνάρτηση έχει τたうοおみくろんνにゅー τύπο σしぐまτたうηいーたνにゅー Haskell. Στις περισσότερες αντικειμενοστραφείς γλώσσες προγραμματισμού πぱいοおみくろんυうぷしろん υποστηρίζουν παραμετρικό πολυμορφισμό, οおみくろんιいおた παράμετροι μπορούν νにゅーαあるふぁ περιοριστούν ώστε νにゅーαあるふぁ είναι υποτύποι κάποιου τύπου (δείτε Πολυμορφισμός υποτύπων κかっぱαあるふぁιいおた τたうοおみくろん άρθρο Generic programming).

  1. 1,0 1,1 1,2 Pierce, B. C. 2002 Types and Programming Languages. MIT Press.
  2. Cardielli, Luca. On Understanding Types, Data Abstraction, and Polymorphism ACM Computing Surveys.