Ce se intelege prin fold ?

From HaskellWiki
Revision as of 22:45, 13 December 2007 by Ha$kell (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Fold este numele unui sablon recursiv de procesarea a listelor. El este implementat in Haskell sub numele foldr.

Stim cu totii ca prelucrarea unei liste se poate face adesea dupa o schema recursiva. Aceasta schema depinde de doua lucruri:

- un caz initial, nerecursiv, (care apare in demonstratii ca baza a inductiei )
- o formula folosita in cazul exprimarii recursive atunci cand descriem cum se foloseste valoarea din capul listei si rezultatul prelucrarii  cozii listei pentru a obtine rezultatul final.

Ca o prima idee puteti considera ca pe o lista [1,2,9,3,4] care este de fapt 1:2:9:3:4:[] fold f v inlocuieste constructorul : cu o functie f data de dumneavoastra si [] cu o valoare v data de dumneavoastra.

Exemplu: Inlocuind (:) cu (+) si [] cu 0 puteti obtine 1+2+9+3+4+0 care este suma elementelor listei. Adica puteti reinventa functia de sumare a elementelor unei liste scriind: fold (+) 0

O serie de alti algoritmi si functii uzuale se pot scrie folosind fold. Acest sablon are o serie mare de alte aplicatii.

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

Nota: Deoarece functia aplicata poate sa nu fie comutativa in Haskell exista 2 de fold: foldl si foldr, care parcurg lista asociind de la stanga respectiv de la dreapta. Cel la care ne-am referit mai sus e implemnentat sub numele de foldr.