97 votes

Comment fonctionne foldr ?

Quelqu'un peut-il expliquer comment fonctionne foldr ?

Prenez ces exemples :

Prelude> foldr (-) 54 [10, 11]
53
Prelude> foldr (\x y -> (x+y)/2) 54 [12, 4, 10, 6]
12.0

Je suis perplexe à propos de ces exécutions.

197voto

Tirpen Points 1119

La façon la plus simple de comprendre foldr est de réécrire la liste que vous pliez sans le sucre.

[1,2,3,4,5] => 1:(2:(3:(4:(5:[]))))

maintenant ce que foldr f x fait c'est qu'il remplace chaque : par f sous forme d'infixe et [] par x et évalue le résultat.

Par exemple :

sum [1,2,3] = foldr (+) 0 [1,2,3]

[1,2,3] === 1:(2:(3:[]))

donc

sum [1,2,3] === 1+(2+(3+0)) = 6

23voto

Jeff Foster Points 22175

foldr signifie plier à partir de la droite, donc foldr (-) 0 [1, 2, 3] produit (1 - (2 - (3 - 0))). En comparaison foldl produit (((0 - 1) - 2) - 3).

Lorsque les opérateurs ne sont pas commutatifs foldl et foldr obtiendront des résultats différents.

Dans votre cas, le premier exemple s'étend à (10 - (11 - 54)) ce qui donne 53.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X