Difference between revisions of "Care este deosebirea dintre foldl si foldr ?"
m |
m |
||
Line 18: | Line 18: | ||
foldr :: '''(a -> b -> b) -> b -> [a] -> b''' <br> |
foldr :: '''(a -> b -> b) -> b -> [a] -> b''' <br> |
||
+ | O foarte buna lucrare despre fold(r), existenta sa si implicatiile existentei sale se putea gasi aici: |
||
+ | [http://www.cs.nott.ac.uk/~gmh/foldl.pdf A tutorial on the universality and expressiveness of fold ]- by Graham Hutton, Univ. of Nottingham, UK . |
||
---- |
---- |
||
Revision as of 17:10, 19 January 2008
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 .