Η γλώσσα ML σε βάθος. Joan Miró, El Carnaval del Arlequín, Κωστής Σαγώνας Νίκος Παπασπύρου

Σχετικά έγγραφα
Η γλώσσα ML σε βάθος. Τι σημαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγμα επισημειώσεων τύπων στην ML. Επισημειώσεις τύπων (type annotations)

Τι σημαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγμα επισημειώσεων τύπων στην ML. Επισημειώσεις τύπων (type annotations) f : A B σημαίνει:

Η γλώσσα ML σε βάθος. Γλώσσες Προγραμματισμού Ι. Διδάσκοντες: Νικόλαος Παπασπύρου, Κωστής Σαγώνας

Τι σηµαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγµα επισηµειώσεων τύπων στην ML. Επισηµειώσεις τύπων (type annotations) Σύνταξη ταιριάσµατος

Εισαγωγή στη Γλώσσα ML. Juan Miró

Εισαγωγή στη Γλώσσα ML

ΚΥΡΙΑ ΜΟΝΤΕΛΑ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Εισαγωγή στη Γλώσσα ML

Αφαίρεση στον FP. Πολυμορφισμός Συναρτήσεις υψηλότερης τάξης Οκνηρός και Άπληστος Υπολογισμός

Συναρτησιακός Προγραμματισμός 2008 Λύσεις στο Δεύτερο Φύλλο Ασκήσεων

Ορισμός Συναρτήσεων στην ΜL

Σύντομη Εισαγωγή στην SML/NJ

Στόχοι και αντικείμενο ενότητας. Εκφράσεις. Η έννοια του τελεστή. #2.. Εισαγωγή στη C (Μέρος Δεύτερο) Η έννοια του Τελεστή

Γλώσσες προγραµµατισµού. Ανάπτυξη Συστηµάτων Λογισµικού

Συμπερασμός Τύπων και Πολυμορφισμός

Συμπερασμός Τύπων και Πολυμορφισμός 4

ΗΥ-150. Προγραμματισμός

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

ΗΥ-150. Προγραμματισμός

Συμπερασμός Τύπων και

Συμπερασμός Τύπων και

Συμπερασμός Τύπων και Πολυμορφισμός

Διαδικασιακός Προγραμματισμός

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

3 ο Εργαστήριο Μεταβλητές, Τελεστές

Ευφυής Προγραμματισμός

Εμβέλεια. Παραδείγματα. Παραδείγματα. Μπλοκ (blocks)

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

ΜΑΗΣ ΕΞΕΤΑΣΤΙΚΟ ΔΟΚΙΜΙΟ

Εισαγωγή στον Προγραμματισμό

ΒΑΣΙΚΟΙ ΤΥΠΟΙ ΔΕΔΟΜΕΝΩΝ

Εγγραφές Δραστηριοποίησης

Ονόματα και Εμβέλεια. Wassily Kandinsky, Black lines, 1913

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

Εισαγωγή στον Προγραμματισμό

ΗΥ-150. Προγραµµατισµός. Εντολές Ελέγχου Ροής

Προγραμματισμός Η/Υ. Ενότητα 2β: Εισαγωγή στη C (Μέρος Δεύτερο)

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

Εγγραφές Δραστηριοποίησης. Jackson Pollock, The Key, 1946 (action painting)

5 &6. Τύποι δεδομένων, τελεστές και

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Προγραμματισμός ΗΥ και Υπολογιστική Φυσική. Χρήστος Γκουμόπουλος

Βασικοί τύποι δεδομένων (Pascal) ΕΠΑ.Λ Αλίμου Γ Πληροφορική Δομημένος Προγραμματισμός (Ε) Σχολ. Ετος Κων/νος Φλώρος

ΚΕΦΑΛΑΙΟ 8 Η ΓΛΩΣΣΑ PASCAL

Μεταγλωττιστές. Σημασιολογική Ανάλυση. Εργαστήριο 9. Διδάσκοντες: Δρ. Γεώργιος Δημητρίου Δρ. Άχμεντ Μάχντι

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Pascal, απλοί τύποι, τελεστές και εκφράσεις

alpha Language age (3/5) alpha Language Φροντιστήριο Syntax Directed Translation and

ΕισαγωγήστουςΗ/Υ. PHP Hypertext Preprocessor

Εγγραφές Δραστηριοποίησης

Διάλεξη 17: Δυαδικά Δέντρα. Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

Ευφυής Προγραμματισμός

Διάλεξη 3η: Τύποι Μεταβλητών, Τελεστές, Είσοδος/Έξοδος

Runtime Checking (1/3) Runtime Checking (2/3) Runtime Checking (3/3) ΗΥ 340 Γλώσσες και Μεταφραστές Φροντιστήριο

Ευφυής Προγραμματισμός

Προγραμματισμός Ι (ΗΥ120)

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

Προγραμματισμός Ι (HY120)

Β. Εισαγωγή στον Προγραμματισμό Η/Υ με την JavaScript

Haskell: Βασικές Δομές Δεδομένων και Απόκρυψη Ονομάτων

Διαδικασιακός Προγραμματισμός

Γλώσσες Προγραμματισμού Μεταγλωττιστές

Λειτουργικά. Συστήματα Ι. Φ ρ ο ν τ ι σ τ ή ρ ι ο. Αριστείδης Ηλίας. Εργαστήριο Ηλεκτρονικών Υπολογιστών

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Εισαγωγή στον Προγραμματισμό

Αντικειμενοστρεφής Προγραμματισμός

n true false if t then t else t u t t b t emptylist cons t t t t λx.t u ::= head tail isempty

Ασκήσεις σε Επαναληπτικούς Βρόχους και Συναρτήσεις. Επανάληψη για την ενδιάμεση εξέταση. (Διάλεξη 13)

Προγραμματισμός Η/Υ. Ενότητα 4: Εντολές Επιλογής

Προγραμματισμός Ι (ΗΥ120)

Στοιχειώδης προγραμματισμός σε C++

οµές Επιλογής Εντολές if και switch

Κεφάλαιο 4: Συνθήκες Έλεγχου (if-else, switch) και Λογικοί τελεστές / παραστάσεις. (Διάλεξη 8)

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Δομή Επιλογής. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

Κεφάλαιο 2.5: Τύποι Δεδομένων, Τελεστές και Αριθμητικές Εκφράσεις. (Διαλέξεις 5-6)

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL)

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ Ανώτατο Εκπαιδευτικό Ίδρυμα Πειραιά Τεχνολογικού Τομέα. Προγραμματισμός Η/Υ

Παράμετροι. Νίκος Παπασπύρου. Claude Monet, Poppies, 1873

a = 10; a = k; int a,b,c; a = b = c = 10;

ιαδικαστικός Προγραμματισμός

Τύποι δεδομένων, τελεστές, μεταβλητές

Δομημένος Προγραμματισμός (ΤΛ1006)

Προγραμματισμός PASCAL

Κάποιες γενικές παρατηρήσεις:

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Παράμετροι 19/9/2007. Πέρασμα παραμέτρων. Περιεχόμενα. Θέσεις και ονόματα στο ταίριασμα παραμέτρων. Ταίριασμα παραμέτρων μέσω ονομάτων

Συµπερασµός Τύπων και Πολυµορφισµός. Συµπερασµός Τύπων και Πολυµορφισµός. Εισαγωγή: Σύγκριση µεταξύ γλωσσών. Περιεχόµενα.

Διάλεξη 5η: Εντολές Επανάληψης

Εντολές επιλογής Επαναλήψεις (if, switch, while)

Υπολογισμός - Εντολές Ελέγχου

if(συνθήκη) {... // οµάδα εντολών } C: Από τη Θεωρία στην Εφαρµογή 5 ο Κεφάλαιο

Συμπερασμός Τύπων και Πολυμορφισμός

ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 4-1

lab13grades 449 PASS 451 PASS PASS FAIL 1900 FAIL Page 1

Προγραμματισμός Ι. Δείκτες. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Διδάσκων: Κωνσταντίνος Κώστα

Transcript:

Η γλώσσα ML σε βάθος Joan Miró, El Carnaval del Arlequín, 1925 Κωστής Σαγώνας <kostis@cs.ntua.gr> Νίκος Παπασπύρου <nickie@softlab.ntua.gr>

Τι σημαίνουν οι τύποι συναρτήσεων στην ML f : A B σημαίνει: Για κάθε x A, για κάποιο στοιχείο y=f(x) B f(x) = ατέρμονη εκτέλεση η εκτέλεση τερματίζει εγείροντας κάποια εξαίρεση Με λόγια: εάν η αποτίμηση f(x) τερματίσει κανονικά, τότε f(x) B Δηλαδή, η πρόσθεση δε θα εκτελεστεί σε μια έκφραση της μορφής f(x)+3 εάν η f(x) εγείρει κάποια εξαίρεση Η γλώσσα ML σε βάθος 2

Επισημειώσεις τύπων (type annotations) - fun prod (a,b) = a*b; val prod = fn : int * int -> int Γιατί int και όχι real; Διότι ο προεπιλεγμένος τύπος (default type) του αριθμητικού τελεστή * (όπως και των +, ) είναι int * int -> int Αν θέλουμε να χρησιμοποιήσουμε τη συνάρτηση με ορίσματα τύπου real μπορούμε να βάλουμε μια υποσημείωση τύπου στα συγκεκριμένα ορίσματα Η γλώσσα ML σε βάθος 3

Παράδειγμα επισημειώσεων τύπων στην ML - fun prod (a:real,b:real):real = a*b; val prod = fn : real * real -> real Οι επισημειώσεις τύπων αποτελούνται από μια άνω κάτω τελεία και έναν τύπο και μπορούν να μπουν παντού Όλοι τα παρακάτω ορισμοί είναι ισοδύναμοι: fun prod (a,b):real = a * b; fun prod (a:real,b) = a * b; fun prod (a,b:real) = a * b; fun prod (a,b) = (a:real) * b; fun prod (a,b) = a * b:real; fun prod (a,b) = (a*b):real; fun prod ((a,b):real * real) = a*b; Η γλώσσα ML σε βάθος 4

Συναρτήσεις μετατροπής τύπων - real 123; (* real here is a function *) val it = 123.0 : real - floor 3.6; val it = 3 : int - str #"a"; val it = "a" : string Ενσωματωμένες συναρτήσεις μετατροπής τύπων: real (int real), floor (real int), ceil (real int), round (real int), trunc (real int), ord (char int), chr (int char), str (char string) Η γλώσσα ML σε βάθος 5

Σύνταξη ταιριάσματος Ένας κανόνας έχει την παρακάτω σύνταξη στην ML: <rule> ::= <pattern> => <expression> Ένα ταίριασμα αποτελείται από έναν ή περισσότερους κανόνες που διαχωρίζονται μεταξύ τους από : <match> ::= <rule> <rule> ' ' <match> Σε ένα ταίριασμα κάθε κανόνας πρέπει να έχει τον ίδιο τύπο με την έκφραση (expression) στο δεξί μέρος του κανόνα Ένα ταίριασμα δεν είναι έκφραση από μόνο του, αλλά αποτελεί μέρος διαφόρων εκφράσεων της ML Η γλώσσα ML σε βάθος 6

Εκφράσεις case - case 1+1 of = 3 => "three" = 2 => "two" = _ => "hmmm..."; val it = "two" : string Έχουν τη σύνταξη: <case-expr> ::= case <expression> of <match> Ηέκφρασηcase της ML είναι μια πολύ ισχυρή δομή και αντίθετα με τις περισσότερες άλλες γλώσσες, μπορεί να κάνει περισσότερα από απλή σύγκριση με σταθερές Η γλώσσα ML σε βάθος 7

Παράδειγμα χρήσης case case list of _::_::c::_ => c _::b::_ => b a::_ => a nil => 0 Η τιμή αυτής της έκφρασης είναι: το τρίτο στοιχείο της λίστας list, αν η λίστα έχει τουλάχιστον τρία στοιχεία, ή το δεύτερο στοιχείο της λίστας αν η λίστα έχει μόνο δύο στοιχεία το πρώτο στοιχείο της λίστας list αν έχει μόνο ένα, ή ο ακέραιος 0 αν η λίστα list είναι κενή Λόγω του τελευταίου κανόνα, η λίστα πρέπει να είναι μια λίστα ακεραίων Η γλώσσα ML σε βάθος 8

Η έκφραση case είναι μια γενίκευση της if if exp 1 then exp 2 else exp 3 case exp 1 of true => exp 2 false => exp 3 Οι δύο παραπάνω εκφράσεις είναι ισοδύναμες Με άλλα λόγια, η έκφραση if-then-else είναι ειδική περίπτωση μιας έκφρασης case Η γλώσσα ML σε βάθος 9

Αποτίμηση βραχυκύκλωσης στην ML - true orelse 1 div 0 = 0; val it = true : bool Οι τελεστές andalso και orelse βραχυκυκλώνουν (short-circuit) στην ML: Εάν η έκφραση του πρώτου ορίσματος του orelse αποτιμάται ως αληθής (true), η έκφραση του δεύτερου δεν αποτιμάται Παρόμοια, εάν το πρώτο όρισμα του andalso είναι ψευδές Με βάση το γράμμα της θεωρίας, δεν είναι πραγματικοί τελεστές αλλά λέξεις κλειδιά Αυτό διότι, σε μια πρόθυμη (eager) γλώσσα σαν την ML, όλοι οι τελεστές αποτιμούν πλήρως τα ορίσματά τους Η γλώσσα ML σε βάθος 10

Πολυμορφικές συναρτήσεις για λίστες Αναδρομική συνάρτηση που υπολογίζει το μήκος μιας λίστας (οποιουδήποτε τύπου) - fun length x = = if null x then 0 = else 1 + length (tl x); val length = fn : 'a list -> int - length [true,false,true]; val it = 3 : int - length [4.0,3.0,2.0,1.0]; val it = 4 : int Σημείωση: ησυνάρτησηlength είναι μέρος της ML, οπότε ο παραπάνω ορισμός είναι περιττός Η γλώσσα ML σε βάθος 11

Πολυμορφισμός για τύπους ισότητας - fun length_eq x = = if x = [] then 0 = else 1 + length_eq (tl x); val length_eq = fn : ''a list -> int - length_eq [true,false,true]; val it = 3 : int - length_eq [4.0,3.0,2.0,1.0]; Error: operator and operand don't agree [equality type required] Μεταβλητές τύπων που αρχίζουν με δύο αποστρόφους, όπως ο ''a, περιορίζονται σε τύπους ισότητας Η ML συμπεραίνει αυτόν τον περιορισμό διότι συγκρίναμε τη μεταβλητή x για ισότητα με την κενή λίστα. Αυτό δε θα συνέβαινε εάν είχαμε χρησιμοποιήσει τη συνθήκη null x αντί για την x=[]. Η γλώσσα ML σε βάθος 12

Αποδοτικές συναρτήσεις για λίστες Αναστροφή μιας λίστας fun reverse nil = nil reverse (x::xs) = (reverse xs) @ [x]; Ερωτήσεις: Είναι σωστή η παραπάνω υλοποίηση της συνάρτησης reverse; Πόσο αποδοτική είναι; Μπορούμε να αναστρέψουμε μια λίστα με ένα μόνο πέρασμα; Η γλώσσα ML σε βάθος 13

Πιο αποδοτική συνάρτηση reverse fun reverse xs = let fun rev (nil, z) = z rev (y::ys, z) = rev (ys, y::z) in rev (xs, nil) end; 1 3 2 2 2 2 3 3 1 3 1 1 Η γλώσσα ML σε βάθος 14

Συναρτήσεις Υψηλής Τάξης Η γλώσσα ML σε βάθος 15

Η λέξη κλειδί op - op *; val it = fn : int * int -> int - quicksort ([1,4,3,2,5], op <); val it = [1,2,3,4,5] : int list Οι δυαδικοί τελεστές είναι ειδικές συναρτήσεις Όμως μερικές φορές θέλουμε να τους χρησιμοποιήσουμε ως κοινές συναρτήσεις: για παράδειγμα, να περάσουμε τον τελεστή < σαν όρισμα τύπου int * int -> bool Η λέξη κλειδί op πριν από κάποιον τελεστή επιστρέφει την αντίστοιχη συνάρτηση Η γλώσσα ML σε βάθος 16

Συναρτήσεις υψηλής τάξης Κάθε συνάρτηση έχει μία τάξη (order): Μια συνάρτηση που δεν παίρνει άλλες συναρτήσεις ως παραμέτρους και δεν επιστρέφει ως αποτέλεσμα μια άλλη συνάρτηση έχει τάξη 1 Μια συνάρτηση που παίρνει άλλες συναρτήσεις ως παραμέτρους ή επιστρέφει ως αποτέλεσμα μια άλλη συνάρτηση έχει τάξη n+1, όπου n είναι η μέγιστη τάξη των παραμέτρων της και του αποτελέσματός της Η συνάρτηση quicksort που μόλις είδαμε είναι συνάρτηση δεύτερης τάξης - quicksort; val it = fn : ('a list) * ('a * 'a -> bool) -> 'a list Η γλώσσα ML σε βάθος 17

Πρακτική εξάσκηση Τι τάξεως είναι οι συναρτήσεις της ML με τους παρακάτω τύπους; int * int -> bool int list * (int * int -> bool) -> int list int -> int -> int (int -> int) * (int -> int) -> (int -> int) int -> bool -> real -> string Τι μπορούμε να πούμε για την τάξη της συνάρτησης με τον παρακάτω τύπο; ('a -> 'b) * ('c -> 'a) -> 'c -> 'b Η γλώσσα ML σε βάθος 18

Προκαθορισμένες συναρτήσεις υψηλής τάξης Τρεις σημαντικές προκαθορισμένες συναρτήσεις υψηλής τάξης: 1. map 2. foldr 3. foldl Η foldr και η foldl είναι παρόμοιες Η γλώσσα ML σε βάθος 19

Ησυνάρτησηmap Εφαρμόζει μια συνάρτηση σε κάθε στοιχείο μιας λίστας και επιστρέφει τα αποτελέσματα της εφαρμογής σε μια νέα λίστα - map ~ [1,2,3,4]; val it = [~1,~2,~3,~4] : int list - map (fn x => x+1) [1,2,3,4]; val it = [2,3,4,5] : int list - map (fn x => x mod 2 = 0) [1,2,3,4]; val it = [false,true,false,true] : bool list - map (op +) [(1,2),(3,4),(5,6)]; val it = [3,7,11] : int list - val f = map (op +); val f = fn : (int * int) list -> int list - f [(1,2),(3,4)]; val it = [3,7] : int list Η γλώσσα ML σε βάθος 20

Ησυνάρτησηfoldr Συνδυάζει, μέσω μιας συνάρτησης, όλα τα στοιχεία μιας λίστας Παίρνει ως ορίσματα μια συνάρτηση f, μια αρχική τιμή c, και μια λίστα x = [x 1,, x n ] και υπολογίζει την τιμή: f ( x f ( x, L f ( x, f ( x c )) L )) 1, 2 n 1 n, Για παράδειγμα η κλήση: foldr (op +) 0 [1,2,3,4] αποτιμάται σε 1+(2+(3+(4+0)))=10 Η γλώσσα ML σε βάθος 21

Παραδείγματα χρήσης foldr - foldr (op +) 0 [1,2,3,4]; val it = 10 : int - foldr (op * ) 1 [1,2,3,4]; val it = 24 : int - foldr (op ^) "" ["abc","def","ghi"]; val it = "abcdefghi" : string - foldr (op ::) [5] [1,2,3,4]; val it = [1,2,3,4,5] : int list - foldr; val it = fn : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b - foldr (op +); val it = fn : int -> int list -> int - foldr (op +) 0; val it = fn : int list -> int - val addup = foldr (op +) 0; val addup = fn : int list -> int - addup [1,2,3,4,5]; val it = 15 : int Η γλώσσα ML σε βάθος 22

Ησυνάρτησηfoldl Συνδυάζει, μέσω μιας συνάρτησης, όλα τα στοιχεία μιας λίστας (όπως η foldr) Παίρνει ως ορίσματα μια συνάρτηση f, μια αρχική τιμή c, και μια λίστα x = [x 1,, x n ] και υπολογίζει την τιμή: f ( x f ( x, L f ( x, f ( x c )) L )) n, n 1 2 1, Για παράδειγμα η κλήση: foldl (op +) 0 [1,2,3,4] αποτιμάται σε 4+(3+(2+(1+0)))=10 Σημείωση: Η foldr αποτιμήθηκε ως 1+(2+(3+(4+0)))=10 Η γλώσσα ML σε βάθος 23

Παραδείγματα χρήσης foldl Η foldl αρχίζει από αριστερά, η foldr από τα δεξιά Φυσικά, δεν υπάρχει κάποια διαφορά όταν η συνάρτηση είναι αντιμεταθετική και προσεταιριστική, όπως οι + και * Για άλλες συναρτήσεις όμως υπάρχει διαφορά - foldr (op ^) "" ["abc","def","ghi"]; val it = "abcdefghi" : string - foldl (op ^) "" ["abc","def","ghi"]; val it = "ghidefabc" : string - foldr (op -) 0 [1,2,3,4]; val it = ~2 : int - foldl (op -) 0 [1,2,3,4]; val it = 2 : int Η γλώσσα ML σε βάθος 24

Δηλώσεις Τύπων Δεδομένων Η γλώσσα ML σε βάθος 25

Ορισμοί τύπων δεδομένων Προκαθορισμένος τύπος, αλλά όχι πρωτόγονος στην ML datatype bool = true false; Παραμετρικός κατασκευαστής τύπου (parametric type constructor) για λίστες: datatype 'e list = nil :: of 'e * 'e list Ορίζεται για την ML στην ML! Η γλώσσα ML σε βάθος 26

Ορισμοί τύπων δεδομένων Έχουν τη γενική μορφή datatype <name> = <clause> <clause> <clause> ::= <constructor> <constructor> of <type> Παραδείγματα: datatype color = Red Yellow Green στοιχεία : Red, Yellow, και Green datatype atom = Atm of string Nmbr of int στοιχεία : Atm("a"), Atm("b"),, Nmbr(0), Nmbr(1),... datatype list = Nil Cons of atom * list στοιχεία : Nil, Cons (Atm "a", Nil), Cons (Nmbr 2, Cons (Atm "ugh",nil)),... Η γλώσσα ML σε βάθος 27

Ορισμοί αναδρομικών τύπων δεδομένων datatype d tree = Leaf of d Node of d * d tree * d tree; Παράδειγμα στιγμιότυπου δένδρου Node(4,Node(3,Leaf(1),Leaf(2)), Node(5,Leaf(6),Leaf(7))) 3 4 5 1 2 6 7 Αναδρομική συνάρτηση χρήσης του τύπου δεδομένων fun sum (Leaf n) = n sum (Node (n,t1,t2)) = n + sum(t1) + sum(t2); Η γλώσσα ML σε βάθος 28

Αυστηρό σύστημα τύπων - datatype flip = Heads Tails; datatype flip = Heads Tails - fun isheads x = (x = Heads); val isheads = fn : flip -> bool - isheads Tails; val it = false : bool - isheads Mon; Error: operator and operand don't agree [tycon mismatch] operator domain: flip operand: day Η ML είναι αυστηρή σε σχέση με τους νέους τύπους, ακριβώς όπως θα περιμέναμε Σε αντίθεση π.χ. με τις enum δηλώσεις της C, οι λεπτομέρειες της υλοποίησης δεν είναι εμφανείς στον προγραμματιστή Η γλώσσα ML σε βάθος 29

Κατασκευαστές έναντι συναρτήσεων - datatype exint = Value of int PlusInf MinusInf; datatype exint = MinusInf PlusInf Value of int - PlusInf; val it = PlusInf : exint - MinusInf; val it = MinusInf : exint - Value; val it = fn : int -> exint - Value 42; val it = Value 42 : exint Ο Value είναι ένας κατασκευαστής δεδομένων με μία παράμετρο: την τιμή του ακεραίου int που αποθηκεύει Δείχνει σα συνάρτηση που παίρνει έναν ακέραιο (int) και επιστρέφει έναν exint που περιέχει τον ακέραιο Η γλώσσα ML σε βάθος 30

Όμως ένας Value δεν είναι int - val x = Value 42; val x = Value 42 : exint - x + x; Error: overloaded variable not defined at type symbol: + type: exint Ένας Value 42 είναι ένας exint, όχι ένας ακέραιος (int), παρότι εμπεριέχει έναν Μπορούμε να ανακτήσουμε τις παραμέτρους ενός κατασκευαστή χρησιμοποιώντας ταίριασμα προτύπων Κατά συνέπεια, ο κατασκευαστής Value δεν είναι συνάρτηση: οι κανονικές συναρτήσεις δε μπορούν να χρησιμοποιηθούν με αυτόν τον τρόπο ως πρότυπα Η γλώσσα ML σε βάθος 31

Κατασκευαστές και ταίριασμα προτύπων - fun square PlusInf = PlusInf = square MinusInf = PlusInf = square (Value x) = Value (x*x); val square = fn : exint -> exint - square MinusInf; val it = PlusInf : exint - square (Value 3); val it = Value 9 : exint Διαχειριζόμαστε νέους τύπους δεδομένων με συναρτήσεις σαν την παραπάνω που ορίζονται μέσω ταιριάσματος προτύπων Επειδή ένας exint είναι είτε PlusInf, ή MinusInf, ή Value, η παραπάνω συνάρτηση είναι εξαντλητική ως προς το ταίριασμα προτύπων Η γλώσσα ML σε βάθος 32

Χειρισμός εξαιρέσεων στην ML Μέσω ταιριάσματος προτύπων μπορούμε επίσης να χειριστούμε εξαιρέσεις - fun square PlusInf = PlusInf = square MinusInf = PlusInf = square (Value x) = Value (x*x) = handle Overflow => PlusInf; val square = fn : exint -> exint - square (Value 10000); val it = Value 100000000 : exint - square (Value 100000); val it = PlusInf : exint Θα δούμε περισσότερα για τις εξαιρέσεις στη Java Η γλώσσα ML σε βάθος 33

Ένα ακόμα παράδειγμα: bunch datatype 'x bunch = One of 'x Group of 'x list; Ένα 'x bunch είναι είτε ένα πράγμα τύπου 'x, είτε μια λίστα από πράγματα τύπου 'x Όπως συνήθως, η ML συμπεραίνει τύπους αυτόματα: - One 1.0; val it = One 1.0 : real bunch - Group [true,false]; val it = Group [true,false] : bool bunch Η γλώσσα ML σε βάθος 34

Παράδειγμα: Πολυμορφικός συμπερασμός Η ML μπορεί να συμπεράνει πολυμορφικούς bunch τύπους, αλλά δεν χρειάζεται πάντα να τους επιλύσει πλήρως, όπως για παράδειγμα συμβαίνει όταν σε αυτούς περιλαμβάνονται λίστες - fun size (One _) = 1 = size (Group x) = length x; val size = fn : 'a bunch -> int - size (One 3.14); val it = 1 : int - size (Group [true,false]); val it = 2 : int Η γλώσσα ML σε βάθος 35

Παράδειγμα: Μη πολυμορφικός συμπερασμός - fun sum (One x) = x = sum (Group xlist) = foldr op + 0 xlist; val sum = fn : int bunch -> int - sum (One 5); val it = 5 : int - sum (Group [1,2,3]); val it = 6 : int Χρησιμοποιήσαμε τον τελεστή + (ως όρισμα της foldr) στα στοιχεία της λίστας Κατά συνέπεια, η ML μπορεί να συμπεράνει ότι ο τύπος της παραμέτρου της συνάρτησης sum είναι int bunch Η γλώσσα ML σε βάθος 36

Αυτή ήταν η ML ή τουλάχιστον, όλη η ML που θα δούμε στις διαλέξεις Φυσικά, υπάρχουν κάποια μέρη ακόμα: Εγγραφές (records) που είναι σαν τις πλειάδες αλλά έχουν πεδία με ονόματα π.χ. {name="arnold", age=42} : {name : string, age : int} Πίνακες (arrays) με στοιχεία που μπορούν να τροποποιηθούν Αναφορές (references) για τιμές που μπορούν να τροποποιηθούν Χειρισμός εξαιρέσεων (exception handling) Υποστήριξη encapsulation και απόκρυψης δεδομένων: structures: συλλογές από τύπους δεδομένων + συναρτήσεων signatures: διαπροσωπίες (interfaces) για τα structures functors: κάτι σα συναρτήσεις για structures, που όμως επιτρέπουν μεταβλητές τύπων και την ανάθεση τιμών (instantiation) στις παραμέτρους των structures Η γλώσσα ML σε βάθος 37

Κάποια άλλα μέρη της ML API: the standard basis Προκαθορισμένες συναρτήσεις, τύποι, κ.λπ. Κάποιες από αυτές είναι σε structures: Int.maxInt, Real.Math.sqrt, List.nth, κ.λπ. exene: μια βιβλιοθήκη της ML για εφαρμογές σε γραφικό περιβάλλον X windows Ο Compilation Manager για διαχείριση μεγαλύτερων projects Άλλες διάλεκτοι της ML Objective Caml (OCaml) ΗεπέκτασητηςML για ταυτοχρονισμό (Concurrent ML CML) Η γλώσσα ML σε βάθος 38

Συμπερασματικά για τις συναρτησιακές γλώσσες Η ML είναι η μόνη γλώσσα που θα εξετάσουμε από τις συναρτησιακές γλώσσες προγραμματισμού Σε αυτό το είδος προγραμματισμού, η εκτέλεση γίνεται μέσω αποτίμησης εκφράσεων και ταιριάσματος προτύπων Εάν σας αρέσει αυτό το στυλ προγραμματισμού, υπάρχουν και άλλες συναρτησιακές γλώσσες για εξερεύνηση, όπως η Lisp, η Scheme/Racket, η Haskell, η Clean και η Erlang Η γλώσσα ML σε βάθος 39