View on GitHub

dituoi_agp

Αρχές Γλωσσών Προγραμματισμού

Βασικές έννοιες τύπων

Οι τύποι ομαδοποιούν παρόμοιες τιμές σε κατηγορίες. Η Haskell με το σύστημα τύπων που διαθέτει προστατεύει τον προγραμματιστή από επιπόλαια λάθη.

Εισαγωγή

Χρησιμότητα τύπψν

Από τη στιγμή που έχει ορισθεί ένας τύπος, μπορούμε να καθορίσουμε τι μπορούμε να κάνουμε και τι δεν μπορούμε να κάνουμε με αυτόν.

Χρήση της εντολής :type

Prelude> :type True
True :: Bool
Prelude> :type (3<5)
(3<5) :: Bool

Το σύμβολο :: διαβάζεται ως “έχει τύπο”.

Χαρακτήρες και λεκτικά

Οι χαρακτήρες εσωκλείονται σε απλά εισαγωγικά.

Prelude> :type 'H'
'H' :: Char

Οι συμβολοσειρές εσωκλείονται σε διπλά εισαγωγικά.

Prelude> :type 'Hello World'
'Hello World' :: [Char]

Οι αγκύλες σημαίνουν μια αλυσίδα (λίστα) χαρακτήρων.

Συναρτησιακοί τύποι

Οι συναρτήσεις έχουν τύπους όπως και οι τιμές!

Παράδειγμα: not

Η συνάρτηση not αντιστρέφει λογικές τιμές. Δέχεται μια Bool τιμή και επιστρέφει μια Bool τιμή. Αυτό θα επιστρέψει και η :type.

Prelude> :type not
not :: Bool -> Bool

Δηλαδή η not είναι μια συνάρτηση από αντικείμενα τύπου Bool σε αντικείμενα τύπου Bool

Παράδειγμα: chr και ord

Οι συναρτήσεις chr και ord έχουν τους ακόλουθους τύπους.

chr :: Int -> Char
ord :: Char -> Int

Ο τύπος Int αναφέρεται σε ακέραιους αριθμούς.

Οι συναρτήσεις chr και ord δεν είναι απευθείας διαθέσιμες αλλά πρέπει πρώτα να φορτωθεί το module Data.Char.

Prelude> :m Data.Char
Prelude Data.Char> chr 97
'a'
Prelude Data.Char> chr 98
'b'
Prelude Data.Char> ord 'c'
99

Συναρτήσεις με περισσότερα από ένα ορίσματα

Παράδειγμα: μια συνάρτηση με περισσότερα από ένα ορίσματα.

xor p q = (p || q) && not (p && q)

Ο τύπος της συνάρτησης xor είναι.

xor :: Bool -> Bool -> Bool

Τα δύο πρώτα Bool είναι των παραμέτρων και το τρίτο Bool είναι της τιμής που επιστρέφεται.

Παράδειγμα συνάρτησης από τις βιβλιοθήκες της Haskell για GUIs: openWindow

Ο τύπος της συνάρτησης είναι.

openWindow :: WindowTitle -> WindowSize -> Window

Η συνάρτηση openWindow δέχεται ένα όρισμα τύπου windowTitle και ένα όρισμα τύπου WindowSize και επιστρέφει μια τιμή τύπου Window.

Υπογραφές τύπων στον κώδικα**

Μια συνάρτηση με υπογραφή

xor :: Bool -> Bool -> Bool
xor p q = (p || q) && not (p && q)

Για μεγαλύτερη σαφήνεια, τοποθετούνται πάνω από τον ορισμό των συναρτήσεων υπογραφές τύπων τις οποίες χρησιμοποιεί και ο μεταγλωττιστής.

Επαγωγή τύπου (type inference)

Αν δεν εισαχθεί υπογραφή τύπου για τον τύπο μιας συνάρτησης, τότε η Haskell εντοπίζει τον τύπο της συνάρτησης μέσω της διαδικασίας της επαγωγής τύπου

isL c = c == 'l'

isL.hs

Prelude> :load isL.hs
*Main> :type isL
isL :: Char -> Bool

Ο μεταγλωττιστής ήταν σε θέση να αναγνωρίσει τον τύπο της συνάρτησης. Ωστόσο, αποτελεί καλή πρακτική για λόγους τεκμηρίωσης κώδικα και αποφυγής λαθών να προσθέτουμε ορισμούς τύπους στις συναρτήσεις.

Τύποι και αναγνωσιμότητα

Παράδειγμα: Module με υπογραφές τύπων

module StringManip where

import Data.Char

uppercase, lowercase :: String -> String
uppercase = map toUpper
lowercase = map toLower

capitalize :: String -> String
capitalize x =
  let capWord []     = []
      capWord (x:xs) = toUpper x : xs
  in unwords (map capWord (words x))

Το module ορίζει τρεις συναρτήσεις, τις uppercase, lowercase και capitalize. Από τα ονόματά τους και τους τύπους μπορεί κανείς να σχηματίσει μια καλή εικόνα για τη λειτουργία των συναρτήσεων χωρίς να δει το εσωτερικό τους.

Οι τύποι προλαμβάνουν τα λάθη

"hello" + " world"  -- type error
"hello" ++ " world"  -- "hello world"