Responsabili laborator:
Scopul laboratorului este de a exersa lucrul cu funcții de ordin superior.
O funcție de ordin superior este o funcție care primește ca argument sau returnează o funcție.
applyTwice f x = f (f x) adder x = (+x)
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.
foldr (:) [] l -- intoarce o lista identica cu l foldl (flip (:)) [] l -- intoarce inversul listei l
foldl
este foldl'
, care se găsește în modulul Data.List
.
Prelude> import Data.List Prelude Data.List> :t foldl' foldl' :: (a -> b -> a) -> a -> [b] -> a
Puteți citi aici despre diferențele dintre aceste trei folduri.
Tipurile acestor funcții sunt:
Prelude> :t foldr foldr :: (a -> b -> b) -> b -> [a] -> b Prelude> :t foldl foldl :: (a -> b -> a) -> a -> [b] -> a
Alte funcții de ordin superior des întâlnite: map
, filter
, zipWith
, flip
.
1. Fie două matrici reprezentate ca liste de liste. În rezolvarea exercițiilor de mai jos, puteți folosi doar funcții de ordin superior (împreună cu take
și drop
).
Implementați funcții care să returneze:
i
dintr-o matrice(i, j)
dintr-o matrice
2. O imagine poate fi reprezentată ca o matrice de caractere (numiți, în continuare, “pixeli”). Considerăm că avem trei tipuri de pixeli: '.'
, '*'
, ' '
Implementați următoarele funcții:
'*'
si '.'
devin ' '
, iar ' '
devine '*'
)x
unitățix
la coloana y
x
la linia y
Puteți folosi următoarea imagine pentru a vă testa funcțiile.
l1=" ***** ** ***** ** " l2=" ****** **** ****** **** " l3=" ** * * *** ** * * *** " l4=" * * * *** * * * *** " l5=" * * ** * * ** " l6=" ** ** ** ** ** ** " l7=" ** ** ** ** ** ** " l8=" **** ** * **** ** * " l9=" * *** ** * * *** ** * " l10=" ** ******* ** ******* " l11=" ** ****** ** ****** " l12=" ** ** ** ** " l13=" ** ** ** ** " l14=" ** ** ** ** " l15=" ** ** ** ** ** ** " l16="*** * * *** * * " l17=" *** * *** * " l18=" ****** ****** " l19=" *** *** " img = [l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14,l15,l16,l17,l18,l19]