Documente Academic
Documente Profesional
Documente Cultură
Laborator 2
În acest laborator vom rezolva exercit, ii despre tipuri de date algebrice. Vom defini
funct, ii recursive peste aceste tipuri s, i vom ı̂nvăt, a să utilizăm funct, ii de ordin superior.
Această fis, ă de lucru este organizată pe sect, iuni ce cont, in câte un mini-proiect.
Rezolvat, i pe rând fiecare dintre acestea s, i ceret, i ajutorul profesorului vostru de laborator
ori de câte ori avet, i nevoie.
• După = avem definit, ia constructorilor de valori (eng. value constructors) care ı̂ncep
cu literă mare s, i sunt separat, i de simbolul |: Smartphone, Laptop s, i Tablet.
Exercit, iul 1.2. Încărcat, i ı̂n ghci un fis, ier care cont, ine definit, ia tipului Mobile Device.
Care sunt tipurile pentru Smartphone, Laptop s, i Tablet?
Dacă vet, i ı̂ncerca să evaluat, i ı̂n ghci direct valoarea True observat, i că ghci afis, ează
valoarea True:
1
• No instance for (Show MobileDevice) arising from a use of ‘print’
• In a stmt of an interactive GHCi command: print it
Primim această eroare din cauză că ghci nu asociază o reprezentare ca s, ir de car-
actere a valorii Laptop. Pentru a rezolva această problemă, o solut, ie este să adăugăm
deriving (Show) la definit, ia tipului astfel:
Pentru moment am definit un tip de date nou care are doar trei valori posibile:
Smartphone, Laptop s, i Tablet. În general dorim să putem construi tipuri care au mai
multe valori. Spre exemplu, putem avea tablete de diferite dimensiuni. Pentru a realiza
acest lucru, putem adăuga noi câmpuri constructorilor de valori:
Observat, i că pentru constructorul Tablet am adăugat un câmp de tip Int. Asta ne
va permite să construim mai multe valori de tipul MobileDevice:
Pentru un constructor de tip putem adăuga mai multe câmpuri. Spre exemplu,
putem extinde definit, ia de mai sus astfel ı̂ncât să atas, ăm s, i marca tabletelor:
2
data MobileDevice = Smartphone
| Laptop
| Tablet Int String
deriving (Show)
Exercit, iul 1.3. Creat, i un tip de date Culori care să cont, ină câteva culori. Apoi,
modificat, i tipul MobileDevice astfel ı̂ncât să putet, i atas, a culori pentru fiecare dispozitiv.
As, a cum era de as, teptat, putem defini s, i funct, ii peste tipurile noi de date. Atunci
când dorim să scriem o funct, ie peste un tip de date creat de noi, vom folosi pattern
matching peste valorile tipului. Vom explica acest lucru pe un exemplu: să presupunem
că dorim să scriem o funct, ie care va ı̂ntoarce pentru fiecare dispozitiv o descriere. Con-
siderând prima definit, ie pentru MobileDevice, funct, ia va fi implementată astfel:
Observat, i că funct, ia este definită pentru fiecare constructor ı̂n parte. Astfel, atunci
când descriere se execută, este căutată definit, ia funct, iei corespunzătoare argumentului
dat. Dacă argumentul este Smartphone, atunci ultima linie este cea corespunzătoare.
Exercit, iul 1.4. Utilizând tipul de date Culori scriet, i o funct, ie care afis, ează culorea
fiecărui dispozitiv.
2 Numere naturale
Exercit, iul 2.1. Creat, i un tip de date Nat care să codifice numerele naturale utilizând
doi constructori: Zero s, i Succ, unde Zero va corespunde constantei 0, iar cu Succ vom
construi noi valori.
Observat, ie: Putet, i consulta https://www.math.stonybrook.edu/~scott/sch102.spr17/
Peano.pdf pentru detalii.
Exercit, iul 2.2. Pentru tipul de date nou creat scriet, i o funct, ie care face adunarea a
două numere naturale.
Exercit, iul 2.3. Pentru tipul de date nou creat scriet, i o funct, ie care face ı̂nmult, irea a
două numere naturale.
3
Mai departe vom utiliza următorul tip de date:
data ErrorNat = Error
| Val Nat
deriving (Show)
Exercit, iul 2.4. Scriet, i o funct, ie care face scăderea a două numere naturale. Funct, ia
va returna Error atunci când rezultatul scăderii nu este număr natural sau Val result
unde result este rezultatul operat, iei de scădere.
Exercit, iul 2.5. Scriet, i o funct, ie care face ı̂mpărt, irea a două numere naturale. Funct, ia
va returna Error atunci când ı̂mpărt, irea nu este definită din punct de vedere matematic
sau Val result unde result este rezultatul operat, iei de ı̂mpărt, ire.
4 Liste.
Exercit, iul 4.1. Definit, i un tip de date pentru liste de numere ı̂ntregi.
Exercit, iul 4.2. Scriet, i o funct, ie care caută o valoare de tip ı̂ntreg ı̂ntr-o listă.
Exercit, iul 4.3. Scriet, i o funct, ie care adaugă o valoare de tip ı̂ntreg la sfârs, itul unei
liste.
Exercit, iul 4.4. Scriet, i o funct, ie care adaugă o valoare de tip ı̂ntreg la ı̂nceputul unei
liste.
Exercit, iul 4.5. Scriet, i o funct, ie care adaugă o valoare de tip ı̂ntreg la o pozit, ie dată
ca argument ı̂ntr-o listă.
Exercit, iul 4.6. Scriet, i o funct, ie care returnează maximul dintr-o listă. Pentru cazurile
ı̂n care argumentul este o listă vidă putet, i să utilizat, i un tip asemanator cu ErrorNat.
4
Exercit, iul 4.7. Scriet, i o funct, ie care returnează minimul dintr-o listă. Pentru cazurile
ı̂n care argumentul este o listă vidă putet, i să utilizat, i un tip asemanator cu ErrorNat.
Exercit, iul 4.9. În Haskell avem deja implementat un tip de date pentru liste: http://
hackage.haskell.org/package/base-4.12.0.0/docs/Data-List.html. Scriet, i funct, ii
care să traducă listele implementate aici ı̂n listele din Haskell, s, i reciproc.