sistem static de verificare a tipurilor - adica oricarei expresii I se asociaza un tip
Acest lucru reduce, în cazul Hakell-ului, în mod drastic numărul bug-urilor care ar putea apărea.
sistem infererenţial de tipuri, adică nu este nevoie să specificăm de fiecare dată tipul unei expresii ( tipul variabilei se subînţelege din context ).
aflarea tipului unei expresii
Prelude> :t ’c’
’c’ :: Char
Tipuri in Haskell Tipuri simple
Numere întregi: Int şi Integer:
Int conţine numerele întregi dintre -2^31 şi 2^31-1
Integer este, în esenţă, acelaşi ca şi tipul Int, exceptând faptul că, în acest tip, se poate reprezenta orice număr întreg
De utilizat numai în cazurile în care ştim sigur că se depăşeşte intervalul lui Int
Tipuri in Haskell Tipuri simple
Numerele reale: tipurile Float şi Double:
Float conţine numerele reale in simpla precizie
notaţie zecimală: 265.65
notaţie stiinţifică: 2.6565e2
nu încercaţi să verificaţi faptul că
Double este, în esenţă, acelaşi ca şi tipul Float, exceptând faptul că el reprezintă numerele cu o mai bună precizie.
Tipuri in Haskell Tipuri simple
Tipul boolean: Bool
Tipul Bool conţine numai două valori True şi False
este utilizat pentru reprezentarea rezultatelor unor decizii.
să notăm faptul că şi True şi False se scriu cu literă mare.
Tipuri in Haskell Tipuri simple
Tipul Char
Tipul Char conţine caracterele, şi anume:
caracterele alfabetice, 'a' .. 'z' şi 'A' .. 'Z'
caracterele numerice, '0' .. '9' caracterele simbolice, cum ar fi '!', '(', ' ', '+'
caracterele speciale,cum ar fi '\n' (linie nouă), '\t' ( tab)
Ghilimelele între care se află un caracter sunt cele simple (apostrof) care se găsesc pe tastatură pe aceeaşi tastă cu cele duble, “.
Tipuri in Haskell Tipuri simple
Tipul String
Tipul String conţine valori constituite dintr-un şir de caractere din Char.
Ele se dau între ghilimele duble. De exemplu:
"Romania" este un string alfabetic
"42" un string de cifre
"99(!) mantie gri" este un string amestecat
" " un string de trei spaţii
"" string-ul vid
Tipuri in Haskell Tipuri polimorfe
Sunt acele tipuri pentru care elementele de definire pot varia din punct de vedere al tipului
Exemplu:
Prelude> tail [5,6,7,8,9]
[6,7,8,9]
Prelude> tail "hello"
"ello“
Dupa cum putem observa tipul lui tail este [a] [a], in care a poate avea orice tip.
In carte, la paginile 123 – 124, aveti si alte tipuri polimorfe.
Incercati sa rezolvati exercitiile de la 124. Si ….. Bineinteles, urmariti exact instructiunile
Tipuri in Haskell Tipuri functionale
În Haskell, funcţiile sunt valori de primă clasă
Haskell-ul este bazat pe o extensie a lambda calcului
Lambda calculul este, în mare, o modalitate de a scrie funcţiile.
De exemplu, funcţia f(x)= x*x se scrie in lambda calcul de forma (λx.x*x),
Asa cum masina Turing este modelul programarii imperative, lambda calculul este modelul de baza al programarii functionale.
Fara a insista foarte mult (puteti citi capitolul I pentru asta) s-a demonstrat ca masina Turing si lambda calculul sunt echivalente computational.
De ce scrierea cu λ ? Datorita necesitatii formarii expresiilor pe baza de “reguli”
in Haskell avem posibilitatea sa definim direct functiile ca si λ- expresii
square = \x -> x*x
f = \x y -> 2*x + y
Tipuri in Haskell Tipuri functionale
Tipurile funcţionale se mai numesc si tipuri de nivel inalt
Tipul dat unei functii mimeaza reprezentarea acelei functii in λ-calcul
Exemple:
head :: [a] -> a
tail :: [a] -> [a]
null :: [a] -> Bool
fst :: (a,b) -> a
snd :: (a,b) -> b
(+) :: Num a => a -> a -> a
(*) :: Num a => a -> a -> a
(++) :: [a] -> [a] -> [a]
(:) :: a -> [a] -> [a]
Tipuri in Haskell Tipuri de date utilizator
putem să ne definim tipurile noastre de date şi funcţiile peste ele.
numitele tipuri de date se definesc utilizând cuvântul cheie data.
Exemplu (de definire a unei perechi)
data Pair a b = Pair a b
Prin declaratia “data” se înţelege că definim un tip de date.
După aceasta dăm numele tipului de date
a -ul şi b -ul care urmează sunt tipurile parametrilor.
După semnul egal, specificăm constructorii acestui tip de date.
Dupa constructor scriem din nou “a b” care ne arată că pentru construcţia lui Pair avem nevoie de două valori, una de tip a şi una de tip b.
Această definiţie a introdus o funcţie
Pair :: a -> b -> Pair a b,
pe care o utilizăm să construim perechi.
Tipuri in Haskell Tipuri de date utilizator
Putem scrie funcţii care utilizează perechi:
pairFst (Pair x y) = x
pairSnd (Pair x y) = y
Similare functiilor obisnuite fst si snd
Creati un fisier propriu si definiti tipul Pair dupa cum l-am prezentat.
Salvati, rulati si verificati liniile de interpretor de la pagina 135.
Completati fisierul cu rezolvarea exercitiilor de la pagina 136
Inainte de a prezenta si alte modalitati de definire a tipurilor de date sa vorbim despre:
Tipuri in Haskell Clase de tipuri
Ce or mai fi si astea?
exista posibilitatea de a crea un sistem de “overloading”
Cu alte cuvinte, exista operatii, expresii (in fond functii) comune mai multor tipuri
Pentru a nu mai defini de n-spe ori fiecare functie s-a considerat utila gruparea tipurilor dupa functiile comune
Situatia ar fi similara cu cea din teoria multimilor, adica gruparea elementelor unei multimi pe clase relativ la o relatie de echivalenta
Distinctie: situatia este asemanatoare insa NU identica:
Clasele dintr-o multime sunt disjuncte 2 cate 2 la reprezentanti distincti
Clase distincte de tipuri pot avea, totusi, tipuri in comun.
Tipuri in Haskell Clase de tipuri
Daca un anumit tip α aparţine unei anumite clase de tipuri (adică toate funcţiile asociate acelei clase conţin implementări pentru α) vom spune că α este o instanţă a acelei clase
Int este instanta si a clasei Eq si a clasei Num
Tipuri in Haskell Clase de tipuri
Clasa Eq
este clasa de tipuri pentru care este permisa testarea egalitatii
Cu alte cuvinte, este clasa “dedicata” functiilor == si /=
(==) :: Eq a => a -> a -> Bool
(/=) :: Eq a => a -> a -> Bool
Tipuri in Haskell Clase de tipuri
Clasa Num.
are constante numerice ca şi funcţii.
când vom scrie 3, de exemplu, compilatorul este liber să aleagă tipul lui 3 (întreg sau cu virgulă mobilă, de exemplu).
Se defineşte clasa Num ca fiind clasa care conţine toate numerele şi principalele operaţii peste ele.
Tipurile numerice de bază sunt, aşadar, instanţe ale clasei Num.
Bineînţeles Int, Integer, Float, Double, sunt instanţe ale acestei clase
Tipuri in Haskell Clase de tipuri
Clasa Show
Tipurile din clasa Show au in comun o functie care converteste valori ale acelor tipuri într-o valoare de tip String.
Această funcţie este numită show .
show :: Show a => a -> String
De exemplu,
când aplicăm show numărului întreg 4 se obţine şirul “4”.
când se aplică unui caracter ‘a’ se obţine un şir de trei caractere “’a’” (semnele apostrof sunt şi ele privite ca şi caractere).
Tipuri in Haskell
Aveti in carte intre paginile 146-149 o descriere pe scurt si a altor clase
există şi o ierarhie a claselor în Haskell care este data in figura urmatoare (cea din carte este ceva mai veche)
Clasele Haskell
Ce urmeaza?
Am vazut, pana acum, ca nu am pomenit nimic despre interactivitate
Ati discutat in trecut despre modul de a concepe programe interactive in Haskell, dupa cum s-a descris pe scurt si modul de a impune o executie secventiala a unor instructiuni cu ajutorul cuvantului cheie
do
Ideea este ca orice orice program functional se bazeaza NU pe executia secventiala ci pe evaluare de expresii.
Din acest punct de vedere, limbajul Haskell, este lenes (lazy), in sensul ca evalueaza NUMAI atunci cand I se cere expres acest lucru.
Ce urmeaza?
Tot asa, scriind 3, de exemplu, Haskell o va considera ca functie de valoare constanta si o va evalua ca atare si maine si …
Sau daca in liniile de program apare sin, de exemplu, evaluarea va ramane la fel intr-un argument, indiferent de starea externa a calculatorului
Dar daca scriem un program care sa contina o “functie” today ()?
Daca o evalueaza astazi ofera 4 martie, daca rulez programul maine el ofera 5 martie samd, deci nu este functie.
Dar click-urile unui mouse? Ele sunt functii? Clar nu.
Dar imprimarea sau citirea unui fisier? Nu
Se poate realiza asa ceva in Haskell. Raspunsul provine din Teoria categoriilor, sub forma de
MONADA
Dar despre asta, si poate v-am facut curiosi , incepand cu data urmatoare.