Εισαγωγή στη γλώσσα Haskell

Σχετικά έγγραφα
ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Κεφάλαιο 8 : H γλώσσα προγραµµατισµού Pascal 1 ο Μέρος σηµειώσεων (Ενότητες 8.1 & 8.2 σχολικού βιβλίου)

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

Ανάπτυξη και Σχεδίαση Λογισμικού

επιµέλεια Θοδωρής Πιερράτος

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

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

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

Βασικά στοιχεία της Java

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

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

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

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

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

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

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

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

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

3.1 Αριθμητικοί και Λογικοί Τελεστές, Μετατροπές Τύπου (Casting)

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

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

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

Βασικά στοιχεία γλώσσας προγραμματισμού. Σπάχος Κυριάκος Καθηγητής Πληροφορικής ΠΕ19

Ανάπτυξη και Σχεδίαση Λογισμικού

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

Προγραμματισμός Υπολογιστών & Εφαρμογές Python. Κ.Π. Γιαλούρης

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

Αντικειμενοστρεφής Προγραμματισμός -Python. Κ.Π. Γιαλούρης

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

Τμήμα Πληροφορικής & Επικοινωνιών Δρ. Θεόδωρος Γ. Λάντζος

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

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

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

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

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

ΚΕΦΑΛΑΙΟ 7 ο. Έτσι ο προγραµµατισµός µε τη ΓΛΩΣΣΑ εστιάζεται στην ανάπτυξη του αλγορίθµου και τη µετατροπή του σε σωστό πρόγραµµα.

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

Προγραμματισμός I (Θ)

Pascal Βασικοί τύποι δεδοµένων

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

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

Εισαγωγή στη γλώσσα προγραμματισμού C++

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

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS.

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

Παρακάτω δίνεται o σκελετός προγράμματος σε γλώσσα C. Σχολιάστε κάθε γραμμή του κώδικα.

Πρόβλημα 29 / σελίδα 28

Εισαγωγή στη γλώσσα Haskell

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

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

Κεφάλαιο 10 H γλώσσα συναρτησιακού προγραμματισμού Haskell Τα βασικά

- Αναπαράσταση ακέραιας τιµής : - Εύρος ακεραίων : - Ακέραιοι τύποι: - Πράξεις µε ακεραίους (DIV - MOD)

ΕΡΓΑΣΤΗΡΙΟ 2 ΕΙΣΑΓΩΓΗ ΣΤΗ C. Εργαστήριο 2. Τµήµα Πληροφορικής και Τηλεπικοινωνιών

Visual Basic Βασικές Έννοιες

Βαθμός Σχόλια. lab5 PASS PASS PASS PASS PASS. Οριακά PASS - Καλή δουλειά

Προγραμματισμός και Χρήση Ηλεκτρονικών Υπολογιστών - Βασικά Εργαλεία Λογισμικού

Ανάπτυξη Μεγάλων Εφαρµογών στη Γλώσσα C (2)

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Σημαντικές δυνατότητες των σύγχρονων υπολογιστικών μηχανών: Αξιόπιστη καταγραφή πολύ μεγάλου όγκου δεδομένων

Διάλεξη 1. Πράξεις Τελεστές Έλεγχος Ροής

ιαφάνειες παρουσίασης #2

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Η-Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Εργαστήριο 2 Εντολές Εισόδου/Εξόδου Τελεστές. Δρ. Γιώργος Λαμπρινίδης 23/10/2015 Η - Υ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ 1

Εισαγωγή στον Προγραµµατισµό. Διάλεξη 2 η : Βασικές Έννοιες της γλώσσας προγραµµατισµού C Χειµερινό Εξάµηνο 2011

Εισαγωγή στην γλώσσα προγραμματισμού C

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 3 Ο. Σταθερές-Παράμετροι-Μεταβλητές Αριθμητικοί & Λογικοί Τελεστές Δομή ελέγχου-επιλογής Σύνθετοι έλεγχοι

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

Οι δείκτες στη γλώσσα C

Προγραμματισμός Ι. Θεματική ενότητα 3: Tελεστές. εκφράσεις

Κεφάλαιο 4: Μεταβλητές και εκφράσεις

Δεδομένα, τελεστές, είσοδος/έξοδος

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Εισαγωγή στην Αριθμητική Ανάλυση

Εκφράσεις. Τύποι, Σταθερές & Μεταβλητές. Ορισµός Μεταβλητών

C: Από τη Θεωρία στην Εφαρµογή 2 ο Κεφάλαιο

Γενικά Στοιχεία Ηλεκτρονικού Υπολογιστή

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

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

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

ΑΣΚΗΣΗ 2: ΔΟΜΗ ΠΡΟΓΡΑΜΜΑΤΟΣ C, ΧΕΙΡΙΣΜΟΣ ΜΕΤΑΒΛΗΤΩΝ ΚΑΙ ΣΥΝΑΡΤΗΣΕΙΣ ΕΙΣΟΔΟΥ ΚΑΙ ΕΞΟΔΟΥ

Σχολικό Βιβλίο - Κεφάλαιο 7 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ PASCAL ΠΑΡΟΥΣΙΑΣΗ 13

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

Μεταγλωττιστές. Ενότητα 6: Λεκτική ανάλυση (Μέρος 2 ο ) Αγγελική Σγώρα Τμήμα Μηχανικών Πληροφορικής ΤΕ

ΗΥ-150. Πίνακες (Arrays)

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

Εντολές εισόδου - εξόδου. Εισαγωγή στη C++

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

Κεφάλαιο 4 Σημασιολογία μιας Απλής Προστακτικής Γλώσσας

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

Εισαγωγή στην επιστήμη των υπολογιστών. Υπολογιστές και Δεδομένα Κεφάλαιο 4ο Πράξεις με μπιτ

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

Είδη εντολών. Απλές εντολές. Εντολές ελέγχου. Εκτελούν κάποια ενέργεια. Ορίζουν τον τρόπο με τον οποίο εκτελούνται άλλες εντολές

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

ΦΥΛΛΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ 1

CE 120. Φροντιστήριο 14/10/2011

ΚΕΦΑΛΑΙΟ 2. Τιμές, τύποι, μεταβλητές, λέξεις-κλειδιά, εντολές. 2.1 Εισαγωγή

Transcript:

Haskell

Εισαγωγή στη γλώσσα Haskell ØΕίναι µια καινοτόµα συναρτησιακή γλώσσα προγραµµατισµού γενικής χρήσεως µε µη αυστηρή σηµασιολογία και ισχυρούς τύπους. ØΕίναι περισσότερο ευέλικτη και δυναµική γλώσσα σε σχέση µε τις παραδοσιακές γλώσσες προγραµµατισµού.

Ιστορία ØΗ Haskell πήρε το όνοµα της από τον αµερικάνο επιστήµονα λογικής και µαθηµατικών Haskell Brooks Curry και βασίστηκε πάνω στις παρατηρήσεις του. Ø1990: Πρώτη έκδοση Haskell 1.0 Ø1998: Haskell 98 Ø2010: αναθεωρηµένη έκδοση Haskell 2010.

Πλεονεκτήµατα ØΛύνεται ένα πρόβληµα µε συστηµατικό(µαθηµατικό) τρόπο. Ø Αυξάνεται η παραγωγικότητα του προγραµµατιστή Ø Μειώνονται σηµαντικά τα σφάλµατα και ο προγραµµατιστικός χρόνος. ØΈχει οκνηρή αποτίµηση, δηλαδή δεν υπολογίζει κάτι εκτός κι αν αυτό είναι απολύτως απαραίτητο. Έτσι, αν κάποιοι υπολογισµοί δεν είναι απαραίτητοι δεν γίνονται καθόλου. ØΕυκολότερος ο εντοπισµός λαθών

Μειονεκτήµατα ØΠολλά χαρακτηριστικά της γλώσσας είναι αρκετά περίπλοκα και σύνθετα ØΣυχνά είναι αρκετά δύσκολο να αποφανθούµε για την απόδοση των προγραµµάτων σε σχέση µε την ταχύτητα και την χρήση της µνήµης. ØΔεν µπορεί να είναι πιο γρήγορη από ένα καλογραµµένο πρόγραµµα σε µια χαµηλού επιπέδου γλώσσα όπως η C.

Εφαρµογές σε Haskell Ø Darcs: ένα σύστηµα διαχείρισης εκδόσεων Ø Tα εργαλεία του συστήµατος στην διανοµή GNU/Linux αναπτύχθηκαν σε Haskell Ø Ο Xmonad(ο διαχειριστής παραθύρων για τα X WINDOWS SYSTEM) είναι γραµµένος αποκλειστικά σε Haskell Ø Τα εργαλεία της Bluespec

Πρόσβαση στη γλώσσα Haskell ØΗ χρήση της γλώσσας προγραµµατισµού Haskell προϋποθέτει την ύπαρξη ενός διερµηνέα ή ενός µεταγλωττιστή της Haskell. ØΟ διερµηνέας παρουσιάζει µια κονσόλα, στην οποία ο χρήστης έχει την δυνατότητα να πληκτρολογήσει εκφράσεις Haskell προς αποτίµηση ή εντολές που κατευθύνονται στον διερµηνέα.

Μεταγλωττιστές ØΟι πιο διάσηµοι µεταγλωττιστές της γλώσσας Haskell είναι οι παρακάτω: Haskell Platform Glasgow Haskell Compiler(GHC) Utrecht Haskell Compiler (UHC) Hugs ( Haskell User's Gofer System) Nhc98 HBC

Αποτίµηση των εκφράσεων της Haskell Μια έκφραση της γλώσσας προγραµµατισµού της Haskell µπορεί να είναι ένα από τα εξής: Ø Μια σταθερά. Για ορισµένες σταθερές που υποστηρίζονται από τη Haskell. Ø Ένας τελεστής. Μοναδιαίος τελεστής: ο τελεστής που παίρνει µόνο ένα όρισµα. Δυαδικός τελεστής: τελεστής που παίρνει δυο ορίσµατα.

Αποτίµηση των εκφράσεων της Haskell ØΜια συνάρτηση. ØΜια έκφραση µέσα σε παρένθεση. ØΈνα αναγνωριστικό. Τα αναγνωριστικά συµβολίζουν τιµές που στις εκφράσεις αρχίζουν µε πεζό λατινικό γράµµα και περιέχουν λατινικά γράµµατα και αριθµούς.

Σηµείωση ØΛέξεις- κλειδιά της Haskell δεν µπορούν να χρησιµοποιηθούν ως αναγνωριστικά. ØΌταν δίνουµε µια έκφραση στον διερµηνέα, ο διερµηνέας την αποτιµά και επιστρέφει το αποτέλεσµα. Για παράδειγµα, εάν δώσουµε στον διερµηνέα την έκφραση 2-2*4 η αποτίµηση της έκφρασης θα µας επιστρέψει το αποτέλεσµα 6.

Βασικοί τύποι της Haskell ØΚάθε έκφραση αντιστοιχεί σε έναν τύπο, ο οποίος χαρακτηρίζει το είδος της τιµής που αναπαρίσταται από την εκάστοτε έκφραση. ØΥπάρχουν τέσσερις βασικοί τύποι της Γλώσσας Haskell: Bool (=αληθοτιµές, λογικές τιµές) Int (=ακέραιοι αριθµοί) Float (=αριθµοί κινητής υποδιαστολής) Char (=χαρακτήρες)

Bool Ø Η χρήση του τύπου Bool αναπαριστά τις αληθοτιµές, δηλαδή τις λογικές τιµές. Ø Λαµβάνουν δυο σταθερές (τιµές): True False

Βool ØΟι τελεστές που υποστηρίζονται από τον τύπο Bool είναι οι εξής: == (λογική ισοδυναµία, ισότητα) Δυαδικοί && (λογική σύζευξη) ΙΙ (λογική διάζευξη) /= (ανισότητα, αποκλειστική λογική διάζευξη) Μοναδιαίος not (λογική άρνηση)

Bool ØΗ τιµή της έκφρασης a && b είναι True εάν και µόνο εάν το a και το b είναι True ØΗ τιµή της έκφρασης a b είναι True εάν ένα τουλάχιστον από τα a και b είναι True ØΗ τιµή της έκφρασης not a είναι True αν το a είναι False και είναι False αν το a είναι True

Int ØΗ χρήση του τύπου Int αναπαριστά τον τύπο των ακέραιων αριθµών. ØΠεριλαµβάνονται θετικοί και αρνητικοί αριθµοί. ØΠαραθέτοντας δεκαδικά ψηφία έχουµε τη δυνατότητα να δηµιουργήσουµε σταθερές αυτού του τύπου. ØΕπιτρέπεται η χρήση του µοναδιαίου τελεστή για τη κατασκευή αρνητικών αριθµών.

Δυαδικοί τελεστές για τον τύπο Int Ø+ (Πρόσθεση) Ø- (αφαίρεση) Ø^ (ύψωση) Ø* (πολλαπλασιασµός)

Συναρτήσεις για τον τύπο Int ØDiv (ακέραια διαίρεση) ØMod (υπόλοιπο ακέραιας διαίρεσης) ØAbs (απόλυτη τιµή ορίσµατος) ØRem (υπόλοιπο)

Float ØΑναπαριστά τους αριθµούς κινητής υποδιαστολής, δηλαδή αριθµούς που δεν είναι κατά ανάγκη ακέραιοι.

Σταθερές του τύπου Float ØΧρήση υποδιαστολής (π.χ. 0.5 ) ή ØΕπιστηµονικό συµβολισµό aeb, όπου a ένας αριθµός κινητής υποδιαστολής και b ένας ακέραιος αριθµός. Το παραπάνω συµβολίζει τον αριθµό 10ᵇa. (π.χ. η σταθερά 5.0e-3 συµβολίζει τον αριθµό 0.005).

Float ØΟι τελεστές + (πρόσθεση),- (αφαίρεση) και * (πολλαπλασιασµός) καθώς και όλοι οι τελεστές σύγκρισης υποστηρίζονται από τον τύπο Float. ØΩστόσο, ο τελεστής / συµβολίζει την κανονική διαίρεση.

Συναρτήσεις για τον τύπο Float Øabs(απόλυτη τιµή) Øcos(συνηµίτονο) Øsin(ηµίτονο) Øtan(εφαπτοµένη) Øsqrt(τετραγωνική ρίζα) Øceiling floor round (µετατροπή στον µεγαλύτερο, µικρότερο και πλησιέστερο ακέραιο αριθµό) Ølog(λογάριθµος µε βάση το e) ØfromIntegral(µετατρέπει έναν ακέραιο αριθµό σε αριθµό κινητής υποδιαστολής).

Σηµείωση ØΑξίζει να σηµειωθεί, ότι σε αντίθεση µε τις περισσότερες γλώσσες προγραµµατισµού, στη Haskell, δεν συµβαίνουν αυτόµατες µετατροπές ανάµεσα στους τύπους Int και Float.

Char Η χρήση του τύπου Char αναπαριστά τους χαρακτήρες. Σταθερές του τύπου Char: ØΈνας χαρακτήρας που περικλίεται σε µονά εισαγωγικά (π.χ a, b ). ØΕιδικοί χαρακτήρες: \t (tab) \n (νέα γραµµή) \\ (backslash (\)) \ (µονό εισαγωγικό ( )) \ (διπλό εισαγωγικό ( ))

Συναρτήσεις Ø Ο τρόπος µε τον οποίο προγραµµατίζουµε σε γλώσσα Haskell είναι ο ορισµός συναρτήσεων. Σύνθεση συναρτήσεων(composition): χρήσιµος τελεστής, συµβολίζεται µε «.». Συναρτήσεις ανώτερης τάξης: Οι συναρτήσεις µπορούν να περάσουν σε άλλες συναρτήσεις ως ορίσµατα. Η συνάρτηση που δέχεται ως όρισµα άλλες συναρτήσεις ονοµάζεται συνάρτηση ανώτερης τάξης. Προσοχή βάζουµε τον τύπο της συνάρτησηςορίσµατος µέσα σε παρενθέσεις. Το πλεονέκτηµα των συναρτήσεων υψηλής τάξης είναι η αποφυγή παρόµοιου κώδικα για παρόµοιες λειτουργίες.

Γενική µορφή µιας συνάρτησης Haskell f pat1 patn =E Το καθένα από τα pat1 patn µπορεί να είναι µεταβλητές, σταθερές τιµές ή να έχει µια πιο πολύπλοκη µορφή. Ονοµάζεται πρότυπο(pattern) και συµβολίζει ένα όρισµα συνάρτησης. Το Ε είναι η έκφραση της γλώσσας. Μια συνάρτηση µπορεί να οριστεί και µε περισσότερες από µια εξισώσεις.

Παράδειγµα ØΗ συνάρτηση add είναι µια συνάρτηση δύο ακέραιων ορισµάτων που δίνει ένα ακέραιο αποτέλεσµα. ØΔηλαδή: αdd::int_>int->int

Γραφή Προγράµµατος σε Haskell Για να δηµιουργήσουµε ένα πρόγραµµα σε Haskell, πρέπει πρώτα να ορίσουµε δικές µας τιµές σε νέα ονόµατα. Για να ορίσουµε τιµές θα πρέπει να δηµιουργήσουµε µέσα στον φάκελο που δουλεύουµε ένα αρχείο µε κατάληξη.hs (Haskell scripts). Για να φορτώσουµε τους ορισµούς του αρχείου χρησιµοποιούµε την εντολή :load <όνοµα του αρχείου>, χωρίς την κατάληξη.hs.

Γραφή Προγράµµατος σε Haskell ØΜπορούµε να γράψουµε ένα σχόλιο στο πρόγραµµα µας, χρησιµοποιώντας δύο παύλες (--) στην αρχή της γραµµής. ØΜπορούµε να τερµατίσουµε µια πρόταση µε τον χαρακτήρα «;».

Πρόγραµµα Haskell Παραδείγµατος χάρη, φτιάχνουµε ένα αρχείο FirstProject.hs στον τρέχων φάκελο και το περιεχόµενο του θα είναι : i :: Int --Δηλώνουµε το i integer i = 1 -- Δίνουµε στο i τιµή 1 j :: Int -- Δηλώνουµε το j integer j = 5 -- Δίνουµε στο j τιµή 5 start n= if (n<10) then n+1+i-j else n-1-i+j

Πρόγραµµα Haskell Κάνουµε :load FirstProject και εκτελούµε την εντολή start<έναν αριθµό> Π.Χ.(start 3). Το πρόγραµµα εκτελείτε και βλέπουµε το αποτέλεσµα της πράξης µας. 0 διότι η πράξη εκτελείτε ως start n= 3 if (n<10) --ελέγχει αν το 3 είναι µικρότερο του 10 then n+1+i-j -- εκτελείτε διότι είναι αληθής η if -- 3+1+1-5 =0 else n-1-i+j -- δεν εκτελείτε

Πλειάδες (tuples) Οι πλειάδες προσφέρουν έναν άλλο τρόπο για την αποθήκευση πολλαπλών τιµών σε µια ενιαία τιµή. Οι πλειάδες και οι λίστες έχουν 2 βασικές διαφορές : Οι πλειάδες έχουν ένα σταθερό αριθµό στοιχείων(αµετάβλητο). Τα στοιχεία µιας πλειάδας δεν χρειάζεται να είναι όλα του ίδιου τύπου.

Λίστες(lists) ØΕίναι σειρές οµογενών δεδοµένων µεταβλητού µεγέθους ØΙδιαίτερη σηµασία έχει η σειρά και ο αριθµός εµφάνισης των στοιχείων.

Τρόποι γραφής µιας λίστας ØΚενή λίστα [] η απλούστερη µορφή λίστας ØΑπαρίθµηση στοιχείων της λίστας [1,2,3] ØΧρήση τελεστή : [1,2,3]=1:[2,3]=1:(2:[3])=1:(2:(3:[])) ΣΗΜΕΙΩΣΗ: Όλα τα στοιχεία µιας λίστας θα πρέπει να έχουν τον ίδιο τύπο!!!! (π.χ. όλα ακέραιοι αριθµοί)

Συναρτήσεις της Haskell για λίστες ØΠροσθήκη κεφαλής (:) e : gd = egd ØΣυνένωση πολλών λιστών concat [[],[5,9],[3]] = [5,9,3] ØΜέγεθος λίστας length length hellο:) = 7 ØΣυνένωση (++) [5,8,3] ++[6,9,4] =[5,8,3,6,9,4] ØΚεφαλή (head) /τελευταίο στοιχείο (last) head l =l!!0 head l=l!!(length l-1)

Συναρτήσεις της Haskell για λίστες ØΟυρά (tail) / πρώτα στοιχεία (init) tail[5,1,9] = [1,9] init[3,6,7]=[3,6] ØΕπιλογή (take)/ απόρριψη αριθµού στοιχείων (drop) take 5 [1..10] = [1,2,3,4,5] drop 6 [1,5,7,4,9,12,59,78,45,18,20,25,] = [1,5,7,4,9,12]

Συναρτήσεις της Haskell για λίστες ØΣπάσιµο λίστας (splitat) splitat (5) [-4..4]=([- 4,-3,-2,-1,0],[1,2,3,4]) ØΕπανάληψη (replicate) replicate 1 3 = 111 ØΦιλτράρισµα λίστας (filter) filter (>0) [-4..4]=[1,2,3,4] ØZipping (zip) zip "Haskell" [5,4,3] = [('H',5),('a',4),('s',3)]

Συναρτήσεις της Haskell για λίστες ØUnzipping (unzip) unzip [('H',5),('a',4),('s',3)]= ("Has",[5,4,3]) ØΕπιλογή (takewhile)/απόρριψη µε συνθήκη (dropwhile) takewhile (<3) [1,2,3,4,5] = [1,2] dropwhile (<3) [1,2,3,4,5] = [3,4,5] ØΣυσσωρευτικός υπολογισµός (folding) foldl και foldr foldl (-) 0 [1,3,2] = ((0-1)-3)-2 = -6 foldr (-) 0 [1,5,8] = (1-(5-8))-0 = 4

Παράδειγµα υπολογισµού µήκους λίστας Ølength [1,2,3,4,5]=1+length[2,3,4,5] =1+(1+length[3,4,5]) =1+(1+(1+length[4,5])) =1+(1+(1+(1+length[5]))) =1+(1+(1+(1+(1+length[])))) =1+(1+(1+(1+(1+0)))) =5

Αναδροµικά προγράµµατα µε λίστες ØΗ αναδροµή αποτελεί βασική τεχνική στις συναρτησιακές γλώσσες προγραµµατισµού. ØΧρησιµοποιείται για τον ορισµό συναρτήσεων που επεξεργάζονται διάφορους τύπους δεδοµένων. ØΣτα αναδροµικά προγράµµατα µε λίστες χρησιµοποιείται: Το πρότυπο [] για κενές λίστες Το x:xs για µη κενές λίστες

Συµβολοσειρές Ø Είναι λίστες χαρακτήρων. ØΣυµβολίζονται µε String που αποτελεί συντοµογραφία του τύπου [char] ØΤις γράφουµε σαν ακολουθίες που περικλείονται µέσα σε διπλά εισαγωγικά

Εκφράσεις Διαχωρισµού (list comprehension) Øδηµιουργία µιας λίστας µε µετασχηµατισµό και φιλτράρισµα στοιχείων άλλων λιστών

Απόκρυψη ονοµάτων ØΣυµβάλλει στην τµηµατοποίηση του κώδικα και στην αποδοτικότητα των υπολογισµών ØΜηχανισµοί: Ορατά ονόµατα σε έναν ορισµό: where Ορατά ονόµασε σε µια έκφραση: let Ανώνυµες συναρτήσεις: λ-εκφράσεις Ø ΠΡΟΣΟΧΗ: κανόνας αποφυγής συγκρούσεων ονοµάτων

3D Demo

3D Demo Cube.hs module Cube where import Graphics.UI.GLUT vertex3f :: (GLfloat, GLfloat, GLfloat) -> IO () vertex3f (x, y, z) = vertex $ Vertex3 x y z cube :: GLfloat -> IO () cube w = renderprimitive Quads $ mapm_ vertex3f [ ( w, w, w), ( w, w,-w), ( w,-w,-w), ( w,-w, w), ( w, w, w), ( w, w,-w), (-w, w,-w), (-w, w, w), ( w, w, w), ( w,-w, w), (-w,-w, w), (-w, w, w), (-w, w, w), (-w, w,-w), (-w,-w,-w), (-w,-w, w), ( w,-w, w), ( w,-w,-w), (-w,-w,-w), (-w,-w, w), ( w, w,-w), ( w,-w,-w), (-w,-w,-w), (-w, w,-w) ] cubeframe :: GLfloat -> IO () cubeframe w = renderprimitive Lines $ mapm_ vertex3f [ ( w,-w, w), ( w, w, w), ( w, w, w), (-w, w, w), (-w, w, w), (-w,-w, w), (-w,-w, w), ( w,-w, w), ( w,-w, w), ( w,-w,-w), ( w, w, w), ( w, w,-w), (-w, w, w), (-w, w,-w), (-w,-w, w), (-w,-w,-w), ( w,-w,-w), ( w, w,-w), ( w, w,-w), (-w, w,-w), (-w, w,-w), (-w,-w,-w), (-w,-w,-w), ( w,-w,-w) ] MainProg.hs import Graphics.UI.GLUT import Data.IORef import Bindings main :: IO () main = do (_progname, _args) <- getargsandinitialize initialdisplaymode $= [WithDepthBuffer, DoubleBuffered] _window <- createwindow"graphics window" --Δηµιουργία windows reshapecallback $= Just reshape -- depthfunc $= Just Less angle <- newioref 0 delta <- newioref 0.1 pos <- newioref (0, 0) keyboardmousecallback $= Just (keyboardmouse delta pos) idlecallback $= Just (idle angle delta) displaycallback $= display angle pos mainloop

3D Demo Bindings.hs module Bindings (idle, display, reshape, keyboardmouse) where import Graphics.UI.GLUT import Data.IORef import Display reshape :: ReshapeCallback reshape size = do viewport $= (Position 0 0, size) keyboardmouse :: IORef GLfloat -> IORef (GLfloat, GLfloat) -> KeyboardMouseCallback keyboardmouse a p key Down = case key of (Char ' ') -> a $~! negate (Char '+') -> a $~! (* 2) (Char '-') -> a $~! (/ 2) (SpecialKey KeyLeft ) -> p $~! \(x,y) -> (x-0.1,y) (SpecialKey KeyRight) -> p $~! \(x,y) -> (x+0.1,y) (SpecialKey KeyUp ) -> p $~! \(x,y) -> (x,y+0.1) (SpecialKey KeyDown ) -> p $~! \(x,y) -> (x,y-0.1) _ -> return () keyboardmouse = return () Points.hs module Points where import Graphics.Rendering.OpenGL points :: Int -> [(GLfloat,GLfloat,GLfloat)] points n = [ (sin (2*pi*k/n'), cos (2*pi*k/n'), 0) k <- [1..n'] ] where n' = fromintegral n

3D Demo Display.hs module Display (idle, display) where import Graphics.UI.GLUT import Control.Monad import Data.IORef import Cube import Points display :: IORef GLfloat -> IORef (GLfloat, GLfloat) -> DisplayCallback display angle pos = do clear [ColorBuffer, DepthBuffer] -- clear depth buffer, too clear [ColorBuffer] loadidentity (x',y') <- get pos translate $ Vector3 x' y' 0 preservingmatrix $ do a <- get angle rotate a $ Vector3 0 0 1 rotate a $ Vector3 0 0.1 1 -- changed y-component a bit to show off cube corners scale 0.7 0.7 (0.7::GLfloat) form_ (points 6) $ \(x,y,z) -> preservingmatrix $ do color $ Color3 ((x+1)/2) ((y+1)/2) ((z+1)/2) translate $ Vector3 x y z cube 0.25 color $ Color3 (0::GLfloat) 0 0 -- set outline color to black cubeframe 0.1 -- draw the outline swapbuffers idle :: IORef GLfloat -> IORef GLfloat -> IdleCallback idle angle delta = do d <- get delta angle $~! (+ d) postredisplay Nothing

Πηγές Δικτυογραφία Ø Κοινότητα Ελεύθερου Λογισµικού ΕΜΠ (https://foss.ntua.gr/wiki/index.ph p) Ø Haskell: Βασικές δοµές και απόκρυψη oνοµάτων (Γιάννης Κασσιός)(http://cgi.di.uoa.gr/~kassios/c ourses/fp/slides/pres_2.pdf) Ø Εισαγωγή στη γλώσσα Haskell(Γιάννης Κασσιός)(http://cgi.di.uoa.gr/~kassios/c ourses/fp/notes/1.pdf) Ø Συναρτησιακός Προγραµµατισµός: Η Γλώσσα Haskell(Π. Ροντογιάννης)(http://cgi.di.uoa.gr/~pro ndo/languages/languages.html) Βιβλιογραφία Ø Real World Haskell (Jobn Goerzen & Don stewari)

ΣΑΣ ΕΥΧΑΡΙΣΤΩ ΠΟΛΥ ΓΙΑ ΤΗΝ ΠΡΟΣΟΧΗ ΣΑΣ.