Programare Functionala Cursul nr



Yüklə 460 b.
tarix15.09.2018
ölçüsü460 b.
#82127


Programare Functionala

  • Cursul nr. 2

  • Sistemul de tipuri in Haskell


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



Yüklə 460 b.

Dostları ilə paylaş:




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin