User Tools

Site Tools


laboratoare:03-aplicatii-cu-functii-de-ordin-superior

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
laboratoare:03-aplicatii-cu-functii-de-ordin-superior [2016/03/14 00:51]
mihai.dumitru2201
laboratoare:03-aplicatii-cu-functii-de-ordin-superior [2016/03/15 10:30] (current)
mihai.dumitru2201 [Resurse]
Line 1: Line 1:
 ====== Aplicații cu funcții de ordin superior ====== ====== Aplicații cu funcții de ordin superior ======
 +
 +Responsabili laborator: ​
 +  * [[mihai.dumitru@cti.pub.ro|Dumitru Mihai-Valentin]]
 +  * [[calin.cruceru@cti.pub.ro|Călin Cruceru]]
 +
 +Scopul laboratorului este de a exersa lucrul cu funcții de ordin superior.
 +
 +===== Recapitulare =====
 +
 +O **funcție de ordin superior** este //o funcție care primește ca argument sau returnează o funcție//.
 +
 +<code haskell>
 +applyTwice f x = f (f x)
 +adder x = (+x)
 +</​code>​
 +
 +==== Folduri ====
 +Două funcții de ordin superior foarte importante sunt foldurile pe liste: ''​foldl''​ și ''​foldr''​. Aceasta combină, în mod recursiv, elementele unei liste cu o valoare default, pentru a obține un rezultat.
 +
 +
 +<code haskell>
 +foldr (:) [] l         -- intoarce o lista identica cu l
 +foldl (flip (:)) [] l  -- intoarce inversul listei l
 +</​code>​
 +
 +<​note>​
 +O variantă importantă a lui ''​foldl''​ este ''​foldl%%'​%%'',​ care se găsește în modulul ''​Data.List''​.
 +
 +<​code>​
 +Prelude> import Data.List
 +Prelude Data.List>​ :t foldl'
 +foldl' :: (a -> b -> a) -> a -> [b] -> a
 +</​code>​
 +
 +Puteți citi [[https://​wiki.haskell.org/​Foldr_Foldl_Foldl'​|aici]] despre diferențele dintre aceste trei folduri.
 +
 +
 +</​note>​
 +
 +O vizualizare utilă:
 +{{:​laboratoare:​fold-visualization.png?​800|}}
 +
 +Tipurile acestor funcții sunt:
 +
 +<​code>​
 +Prelude> :t foldr
 +foldr :: (a -> b -> b) -> b -> [a] -> b
 +Prelude> :t foldl
 +foldl :: (a -> b -> a) -> a -> [b] -> a
 +</​code>​
 +
 +<note tip>
 +Nu trebie să rețineți pe de rost tipurile. Încercați să înțelegeți ce exprimă și de ce sunt așa.
 +</​note>​
 +
 +Alte funcții de ordin superior des întâlnite:​ ''​map'',​ ''​filter'',​ ''​zipWith'',​ ''​flip''​.
 +
  
 ===== Exerciții ===== ===== Exerciții =====
Line 13: Line 70:
   * produsul a două matrici   * produsul a două matrici
  
-==== Imagini ca liste ==== 
  
 2. O imagine poate fi reprezentată ca o matrice de caractere (numiți, în continuare, "​pixeli"​). Considerăm că avem trei tipuri de pixeli: ''​%%'​%%.%%'​%%'',​ ''​%%'​%%*%%'​%%'',​ ''​%%'​%% %%'​%%''​ 2. O imagine poate fi reprezentată ca o matrice de caractere (numiți, în continuare, "​pixeli"​). Considerăm că avem trei tipuri de pixeli: ''​%%'​%%.%%'​%%'',​ ''​%%'​%%*%%'​%%'',​ ''​%%'​%% %%'​%%''​
Line 28: Line 84:
  
  
-==== Logo PP ====+===== Resurse ​====== 
 + 
 +Puteți folosi următoarea imagine pentru a vă testa funcțiile. 
 <code haskell> <code haskell>
 l1=" ​       ***** **            ***** **    " l1=" ​       ***** **            ***** **    "
Line 56: Line 115:
 ===== Solutii laborator ==== ===== Solutii laborator ====
   - [[https://​github.com/​Programming-Paradigms/​Labs/​archive/​master.zip | Solutii laborator 3]]   - [[https://​github.com/​Programming-Paradigms/​Labs/​archive/​master.zip | Solutii laborator 3]]
-  - Puteti, alternativ, ​sa folositi urmatorul ​repository git [[https://​github.com/​Programming-Paradigms/​Labs]] pentru a descarca solutiile si le sincroniza, ulterior.+  - Puteți, alternativ, ​să folosiți următorul ​repository git [[https://​github.com/​Programming-Paradigms/​Labs]] pentru a descărca soluțiile și a le sincroniza, ulterior.
laboratoare/03-aplicatii-cu-functii-de-ordin-superior.1457909516.txt.gz · Last modified: 2016/03/14 00:51 by mihai.dumitru2201