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.
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.
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
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 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.