Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pp:23:laboratoare:haskell:intro [2023/04/02 17:00]
bot.pp
pp:23:laboratoare:haskell:intro [2023/04/04 20:46] (current)
bot.pp
Line 160: Line 160:
  
 </​code>​ </​code>​
-**Atenție**:​ În construcția ''​%%(- x)%%''​ operatorul ''​%%-%%''​ este unar, nu binar (este echivalentul funcției ''​%%negate%%''​). Dacă doriți să aplicați pațial la dreapta operatorul de scădere, utilizați funcția ''​%%subtract%%'',​ ca în expresia ''​%%(\%%''​subtract` 2)`.+**Atenție**:​ În construcția ''​%%(- x)%%''​ operatorul ''​%%-%%''​ este unar, nu binar (este echivalentul funcției ''​%%negate%%''​). Dacă doriți să aplicați pațial la dreapta operatorul de scădere, utilizați funcția ''​%%subtract%%'',​ ca în expresia ''​%%(`subtract` 2)%%''​.
  
 ===== Tipuri de bază ===== ===== Tipuri de bază =====
Line 166: Line 166:
 În această secțiune vom prezenta tipurile existente în limbajul Haskell. Veți observa că limbajul este mult mai bogat în tipuri decât Racket. Programatorul își va putea defini alte tipuri proprii dacă dorește. În această secțiune vom prezenta tipurile existente în limbajul Haskell. Veți observa că limbajul este mult mai bogat în tipuri decât Racket. Programatorul își va putea defini alte tipuri proprii dacă dorește.
  
-Pentru a putea vedea tipul unei expresii în ''​%%ghci%%''​ folosiți ''​%%:​t expresie%%''​.+Pentru a vedea tipul unei expresii în ''​%%ghci%%''​ folosiți ''​%%:​t expresie%%''​.
  
 <​code>​ <​code>​
Line 182: Line 182:
 ==== Numere, caractere, siruri, booleeni ==== ==== Numere, caractere, siruri, booleeni ====
  
-Următorii literali sunt valizi in **Haskell** (dupa operatorul ''​%%::​%%''​ sunt precizate tipurile acestora):+Următorii literali sunt valizi in **Haskell** (după operatorul ''​%%::​%%''​ sunt precizate tipurile acestora):
  
 <​code>​ <​code>​
Line 192: Line 192:
  
 </​code>​ </​code>​
-Observați că există tipul caracter și tipul șir de caractere. Tipul ''​%%String%%''​ este de fapt un sinonim pentru tipul ''​%%[Char]%%''​ - tipul listă de caractere. Astfel, operațiile pe [[#​liste|liste]] vor funcționa și pe șiruri.+Observați că există tipul //caracter// și tipul //șir de caractere//. Tipul ''​%%String%%''​ este de fapt un sinonim pentru tipul ''​%%[Char]%%''​ - tipul //listă de caractere//. Astfel, operațiile pe [[#​liste|liste]] vor funcționa și pe șiruri ​de caractere.
  
 Tipurile numerice sunt puțin diferite față de alte limbaje de programare cunoscute: Tipurile numerice sunt puțin diferite față de alte limbaje de programare cunoscute:
Line 203: Line 203:
 În exemplul de mai sus, ''​%%a%%''​ este o variabilă de tip (ține locul oricărui tip) restricționată (prin folosirea ''​%%=>​%%''​) doar la tipurile numerice (''​%%Num a%%''​). În exemplul de mai sus, ''​%%a%%''​ este o variabilă de tip (ține locul oricărui tip) restricționată (prin folosirea ''​%%=>​%%''​) doar la tipurile numerice (''​%%Num a%%''​).
  
-Important de reținut este faptul că există **2** tipuri pentru numere întregi: ''​%%Int%%''​ și ''​%%Integer%%''​. Primul este finit, determinat de arhitectură,​ în timp ce al doilea este infinit, putând ajunge oricât de mare.+Important de reținut este faptul că există **2** tipuri pentru numere întregi: ''​%%Int%%''​ și ''​%%Integer%%''​. Primul este finit, determinat de arhitectură,​ în timp ce al doilea este infinit, putând ajunge oricât de mare (vă puteți imagina că este implementat ca o listă de cifre).
  
 ==== Liste ==== ==== Liste ====
Line 319: Line 319:
  
 </​code>​ </​code>​
-Expresiile din interiorul fiecărei ramuri din ''​%%case%%''​ sau din interiorul pattern-match nu pot fi decât constructorii unui tip (similar cu ce i făcut la AA). În continuare vom folosi cele 4 stiluri pentru a ilustra funcția care calculează lungimea unei liste+Expresiile din interiorul fiecărei ramuri din ''​%%case%%''​ sau din interiorul pattern-match nu pot fi decât constructorii unui tip (asemenea analizei pe cazuri ​TDA-urilor în inducția structurală învățată la AA). În continuare vom folosi cele 4 stiluri pentru a ilustra funcția care calculează lungimea unei liste
  
 <​code>​ <​code>​
Line 357: Line 357:
  
 </​code>​ </​code>​
-Fiecare argument este separat prin ''​%%->​%%''​ de următorul argument (respectiv de rezultat în cazul ultimului argument). Operatorul ''​%%->​%%''​ este asociativ la dreapta. De aceea, semnătura ''​%%a -> b -> c%%''​ este echivalentă cu ''​%%a -> (b -> c)%%''​. Ambele descriu o funcție care primește ​(pe rândun argument de tip ''​%%a%%''​ și unul de tip ''​%%b%%'',​ întorcând un rezultat de tip ''​%%c%%''​.+Fiecare argument este separat prin ''​%%->​%%''​ de următorul argument (respectiv de rezultat în cazul ultimului argument). Operatorul ''​%%->​%%''​ este asociativ la dreapta. De aceea, semnătura ''​%%a -> b -> c%%''​ este echivalentă cu ''​%%a -> (b -> c)%%''​. Ambele descriu o funcție care primeștepe rândun argument de tip ''​%%a%%''​ și unul de tip ''​%%b%%'',​ întorcând un rezultat de tip ''​%%c%%''​.
  
 Amintindu-ne de discuția despre [[https://​ocw.cs.pub.ro/​courses/​pp/​22/​laboratoare/​racket/​functionale#​functii_curryuncurry|funcții curry și uncurry]], rezultatul următor nu trebuie să ne surprindă Amintindu-ne de discuția despre [[https://​ocw.cs.pub.ro/​courses/​pp/​22/​laboratoare/​racket/​functionale#​functii_curryuncurry|funcții curry și uncurry]], rezultatul următor nu trebuie să ne surprindă
Line 370: Line 370:
 Putem transforma o funcție curry (adică o funcție obișnuită) într-una "​uncurry"​ folosind ''​%%uncurry :: (a -> b -> c) -> (a, b) -> c%%''​. Alternativ, putem defini în mod direct o funcție uncurry folosind perechi. Putem transforma o funcție curry (adică o funcție obișnuită) într-una "​uncurry"​ folosind ''​%%uncurry :: (a -> b -> c) -> (a, b) -> c%%''​. Alternativ, putem defini în mod direct o funcție uncurry folosind perechi.
  
 +<​code>​
 +add :: (Int, Int) -> Int
 +add (x, y) = x + y
 +
 +add (2, 3)  -- 5
 +
 +</​code>​
 ===== Funcționale uzuale ===== ===== Funcționale uzuale =====
  
-Haskell oferă un set de funcționale (similar celui din Racket) pentru ​cazuri de folosire des întâlnite ​(dacă nu mai știți ce fac, încercați să ghiciți citind semnătura și numele ca pe o formă de documentație):​+Haskell oferă un set de funcționale (similar celui din Racket) pentru ​situații uzuale ​(dacă nu mai știți ce fac, încercați să ghiciți citind semnătura și numele ca pe o formă de documentație):​
  
 <​code>​ <​code>​
Line 389: Line 396:
  
 </​code>​ </​code>​
-Folosirea lor conduce la un cod mai ușor de citit și de întreținut.+Folosirea lor conduce la un cod mai ușor de citit și de întreținut. De remarcat că ''​%%zip%%''​ nu este o funcțională,​ deoarece nu primește ca parametri funcții și nici nu întoarce funcții, dar este prezentată comparativ cu funcționala ''​%%zipWith%%''​ prin prisma tipurilor. Comportamental,​ ''​%%zip = zipWith (,​)%%'',​ unde ''​%%(,​)%%''​ este constructorul perechilor, înțeles ca o funcție binară, care primește ca parametri cele două componente ale unei perechi.
  
 ===== Domenii de vizibilitate ===== ===== Domenii de vizibilitate =====
pp/23/laboratoare/haskell/intro.1680444049.txt.gz · Last modified: 2023/04/02 17:00 by bot.pp
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0