This shows you the differences between two versions of the page.
| 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. |