Listefoldning ( engelsk folding , også kendt som reducere , akkumulere ) i programmering er en højere-ordens funktion , der konverterer en datastruktur til en enkelt atomværdi ved hjælp af en given funktion. Foldeoperationen bruges ofte i funktionel programmering ved behandling af lister . Folding kan generaliseres til en vilkårlig algebraisk datatype ved at bruge begrebet catamorphism fra kategoriteori .
En opsamlingsfunktion tager normalt tre argumenter: en kombinerende funktion f, en begyndelsesværdi startog en datastruktur seq(en liste i sin enkleste form). Afhængigt af egenskaberne for kombinationsfunktionen kan der være forskellige implementeringer og forskellige strategier til beregning af . Nogle gange tager rollup-funktionen ikke en startværdi, men kræver en ikke-tom liste; men i mange tilfælde kan det være ønskeligt at angive en begyndelsesværdi, der ikke er nul, og som vil blive brugt første gang, kombinationsfunktionen anvendes. Brugen af en startværdi er nødvendig, når resultattypen for kombinationsfunktionen er forskellig fra typen af listeelementer, i hvilket tilfælde startværdien skal være af samme type som resultattypen.
For foldning ved en associativ operation påvirker beregningsrækkefølgen ikke resultatet, for eksempel beregning af summen af listens numre (1 2 3 4 5), dvs. dens foldning med summen, kan udføres i enhver rækkefølge: eller eller , som tillader dig til at beregne foldningen af forskellige dele af listen på samme tid, det vil sige at parallelisere beregningslistefoldningen i multiprocessor- og klyngesystemer.
For ikke-associative operationer har rækkefølgen betydning, derfor, i det generelle tilfælde, for foldning, er det påkrævet at specificere rækkefølgen af beregninger, i forbindelse med dette, højrehåndsfoldning ( højre- associativ ) og venstrehåndsfoldning ( venstre -associative ) skelnes. For en liste seq := (elem_1 elem_2 ... elem_n)vil den venstre associative foldfunktion f.eks. evaluere værdien af udtrykket:
(f ... (f (f start elem_1) elem_2) ... elem_n)og ret associativ:
(f elem_1 (f elem_2 ... (f elem_n start) ... )).Faktorialet n kan repræsenteres som en liste over tal fra 2 til n foldet ved hjælp af multiplikationsoperationen (for eksempel på Haskell-sprog ):
fac n = foldl ( * ) 1 [ 2 .. n ]Her:
Et eksempel på en lignende funktion i Scala :
def fac ( n : BigInt ) = ( BigInt ( 2 ) til n ). foldLeft ( BigInt ( 1 ))( _ * _ )