Programare Functionala Cursul nr 2 Sistemul de tipuri

  • Slides: 21
Download presentation
Programare Functionala Cursul nr. 2 Sistemul de tipuri in Haskell

Programare Functionala Cursul nr. 2 Sistemul de tipuri in Haskell

Tipuri in Haskell Caracteristici • sistem static de verificare a tipurilor - adica oricarei

Tipuri in Haskell Caracteristici • 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 bugurilor 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’ : : Char

Tipuri in Haskell Tipuri simple Numere întregi: Int şi Integer: • Int conţine numerele

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

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. 6565 e 2 • 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ă

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:

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

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

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], 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

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

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 (*) : : Num a => a -> a (++) : : [a] -> [a] (: ) : : a -> [a]

Tipuri in Haskell Tipuri de date utilizator • putem să ne definim tipurile noastre

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:

Tipuri in Haskell Tipuri de date utilizator • Putem scrie funcţii care utilizează perechi: – pair. Fst (Pair x y) = x – pair. Snd (Pair x y) = y • Similare functiilor obisnuite fst si snd • Creati un fisier propriu si definiti tipul Pair dupa cum lam 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

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

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

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 -> Bool (/=) : : Eq a => a -> Bool

Tipuri in Haskell Clase de tipuri • • • Clasa Num. are constante numerice

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

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 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

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

Clasele Haskell

Ce urmeaza? • Am vazut, pana acum, ca nu am pomenit nimic despre interactivitate

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 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

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.