Care este deosebirea dintre foldl si foldr ?

From HaskellWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


In priviinta valorilor ce se vor obtine dupa aplicarea lui foldl si foldr exista diferente. Ele provin din ordinea de parcurgere a listei. Foldl parcurge lista de la stanga iar foldr o parcurge de la dreapta. Evaluati:

Prelude> foldl (\ a b -> 10 * a + b) 0 [1,2]
12
Prelude> foldr (\ a b -> 10 * a + b) 0 [1,2]
30
Prelude>

Diferenta consta in ordinea in care este parcursa lista.
Diferenta se vede mai usor atunci cand functia aplicata are proprietatea de "necomutativitate a argumentelor". Adica e o functie la care schimband ordinea argumentelor se obtine (in general) alta valoare.


In priviinta tipurilor lui foldl si foldr nu este nici o diferenta:
Prelude> :t foldl
foldl :: (a -> b -> a) -> a -> [b] -> a
Prelude> :t foldr
foldr :: (a -> b -> b) -> b -> [a] -> b

O foarte buna lucrare despre fold(r), existenta sa si implicatiile existentei sale se putea gasi aici: A tutorial on the universality and expressiveness of fold - by Graham Hutton, Univ. of Nottingham, UK .


Pagina indexata la indexul Categories:Ro


<= Inapoi la pagina principala Ro/Haskell.

<- Inapoi la inceputul paginii 'Intrebarile incepatorului Ro/Haskell'.