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