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

Γενικευμένος αλγεβρικός τύπος δεδομένων

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

Σしぐまτたうοおみくろんνにゅー συναρτησιακό προγραμματισμό, ένας γενικευμένος αλγεβρικός τύπος δεδομένων (επίσης γνωστός ως GADT κかっぱαあるふぁιいおた πρώτης τάξεως τύπος φάντασμα) είναι μみゅーιいおたαあるふぁ γενίκευση τたうοおみくろんυうぷしろん αλγεβρικού τύπου της Haskell κかっぱαあるふぁιいおた της ML, εφαρμοσμένου πάνω σしぐまεいぷしろん παραμετρικούς τύπους.

Μみゅーεいぷしろん αυτή τたうηいーたνにゅー επέκταση, οおみくろんιいおた παράμετροι τたうοおみくろんυうぷしろん τύπου επιστροφής ενός κατασκευαστή τύπων μπορούν νにゅーαあるふぁ επιλεχθούν ελεύθερα όταν δηλώνεται οおみくろん κατασκευαστής, ενώ γがんまιいおたαあるふぁ αλγεβρικούς τύπους σしぐまτたうηいーたνにゅー Haskell 98, ηいーた παράμετρος τύπου της τιμής επιστροφή συμπεραίνεται από τους τύπους τたうωおめがνにゅー παραμέτρων. Οおみくろんιいおた γενικευμένοι αλγεβρικοί τύποι δεδομένων είναι υλοποιημένοι σしぐまτたうοおみくろんνにゅー μεταγλωττιστή GHC σしぐまαあるふぁνにゅー μみゅーιいおたαあるふぁ επέκταση, ηいーた οποία χρησιμοποιείται, μεταξύ άλλων, από τたうοおみくろんνにゅー Pugs κかっぱαあるふぁιいおた τたうοおみくろんνにゅー Darcs. Ηいーた γλώσσα προγραμματισμού Ωμέγα επεκτείνει τたうηいーた Haskell μみゅーεいぷしろん γενικευμένους αλγεβρικούς τύπους δεδομένων.

Μみゅーιいおたαあるふぁ πρώιμη εκδοχή τたうωおめがνにゅー γενικευμένων αλγεβρικών τύπων δεδομένων είχε δοθεί από τους Augustsson κかっぱαあるふぁιいおた Petersson τたうοおみくろん 1994 κかっぱαあるふぁιいおた βασιζόταν σしぐまτたうοおみくろん ταίριασμα προτύπων σしぐまτたうοおみくろんνにゅー ALF.

Οおみくろんιいおた Sulzmann, Wazny κかっぱαあるふぁιいおた Stuckey εισήγαγαν τους επεκτεταμένους γενικευμένους τύπους δεδομένων οおみくろんιいおた οποίοι συνδυάζουν τους γενικευμένους αλγεβρικούς τύπους δεδομένων μみゅーεいぷしろん τたうοおみくろんνにゅー υπαρξιακό τύπο κかっぱαあるふぁιいおた τους περιορισμούς τύπων κλάσεων πぱいοおみくろんυうぷしろん εισήγαγαν οおみくろんιいおた Perry, Laufer κかっぱαあるふぁιいおた Odersky.

Οおみくろん συμπερασμός τύπων σしぐまτたうηいーたνにゅー έλλειψη οποιασδήποτε επισήμανσης τύπου είναι ένα μみゅーηいーた αποφασίσιμο πρόβλημα κかっぱαあるふぁιいおた οおみくろんιいおた συναρτήσεις πぱいοおみくろんυうぷしろん ορίζονται πάνω σしぐまεいぷしろん γενικευμένους αλγεβρικούς τύπους δεδομένων δでるたεいぷしろんνにゅー επιδέχονται πρωτεύοντες τύπους σしぐまτたうηいーた γενική περίπτωση. Ηいーた επανακατασκευή τύπων απαιτεί πολλούς σχεδιαστικούς συμβιβασμούς κかっぱαあるふぁιいおた αποτελεί τομέα συνεχιζόμενης έρευνας.

Οおみくろんιいおた GADTs βρίσκουν εφαρμογή σしぐまτたうοおみくろんνにゅー προγραμματισμό μみゅーεいぷしろん γενικότητες, στις γλώσσες μοντελοποίησης (αφηρημένη σύνταξη υψηλότερης τάξης), σしぐまτたうηいーたνにゅー διατήρηση αναλλοίωτων σしぐまεいぷしろん δομές δεδομένων, σしぐまτたうηいーたνにゅー έκφραση περιορισμών σしぐまεいぷしろん ενσωματωμένες γλώσσες ειδικού πεδίου κかっぱαあるふぁιいおた σしぐまεいぷしろん αντικείμενα μοντελοποίησης.

Αφηρημένη σύνταξη υψηλότερης τάξης

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

Μみゅーιいおたαあるふぁ σημαντική εφαρμογή τたうωおめがνにゅー γενικευμένων αλγεβρικών τύπων δεδομένων είναι σしぐまτたうηいーたνにゅー ενσωμάτωση της αφηρημένης σύνταξης υψηλότερης τάξης μみゅーεいぷしろん ασφαλή - από άποψη τύπων - τρόπο. Ακολουθεί παράδειγμα ενσωμάτωσης τたうοおみくろんυうぷしろん λάμβδα λογισμού μみゅーεいぷしろん απλούς τύπους μみゅーεいぷしろん μみゅーιいおたαあるふぁ συλλογή από βασικούς τύπους, νにゅー-άδες, κかっぱαあるふぁιいおた έναν συνδυαστή σταθερού σημείου.

data Lam :: * -> * where
  Lift :: a                     -> Lam a
  Tup  :: Lam a -> Lam b        -> Lam (a, b)
  Lam  :: (Lam a -> Lam b)      -> Lam (a -> b)
  App  :: Lam (a -> b) -> Lam a -> Lam b
  Fix  :: Lam (a -> a)          -> Lam a

Κかっぱαあるふぁιいおた μία συνάρτηση υπολογισμού:

eval :: Lam t -> t
eval (Lift v)    = v
eval (Tup e1 e2) = (eval e1, eval e2)
eval (Lam f)     = \x -> eval (f (Lift x))
eval (App e1 e2) = (eval e1) (eval e2)
eval (Fix f)     = (eval f) (eval (Fix f))

Ηいーた συνάρτηση παραγοντικού μπορεί πλέον νにゅーαあるふぁ γραφτεί ως:

fact = Fix (Lam (\f -> Lam (\y -> Lift (if eval y == 0 then 1 else eval y * (eval f) (eval y - 1)))))

Θしーたαあるふぁ είχαμε συναντήσει προβλήματα αあるふぁνにゅー χρησιμοποιούσαμε συνηθισμένους αλγεβρικούς τύπους δεδομένων. Ηいーた μみゅーηいーた χρήση της παραμέτρου τύπου θしーたαあるふぁ έκανε τους ανελιγμένους βασικούς τύπους υπαρξιακά ποσοτικοποιημένους, καθιστώντας τたうοおみくろん αδύνατο νにゅーαあるふぁ γραφτεί ηいーた συνάρτηση υπολογισμού. Μみゅーεいぷしろん κάποια παράμετρο τύπου, θしーたαあるふぁ ήμασταν περιορισμένοι σしぐまεいぷしろん έναν μοναδικό βασικό τύπο. Επιπλέον, κακώς ορισμένες εκφράσεις όπως App (Lam (\x -> Lam (\y -> App x y))) (Lift True) θしーたαあるふぁ μπορούσαν νにゅーαあるふぁ κατασκευαστούν, ενώ εμφανίζουν σφάλμα τύπων μみゅーεいぷしろん GADTs.


Εφαρμογές
Semantics
  • Patricia Johann and Neil Ghani (2008). "Foundations for Structured Programming with GADTs".
  • Arie Middelkoop, Atze Dijkstra and S. Doaitse Swierstra (2011). "A lean specification for GADTs: system F with first-class equality proofs". Higher-Order and Symbolic Computation.
Επανακατασκευή τύπων
Άλλα
  • Andrew Kennedy and Claudio V. Russo. "Generalized algebraic data types and object-oriented programming". In Proceedings of the 20th annual ACM SIGPLAN conference on Object oriented programming, systems, languages, and applications. ACM Press, 2005.

Εξωτερικοί σύνδεσμοι

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