Quelle est la fonction la plus « puissante »,
map ou
reduce ? Sans nous appesantir sur ce qu'est précisément la
puissance, voyons si l'on peut simuler
map avec
reduce
et inversement.
La fonction
map obéit au schéma suivant:
(map f (list e1 e2 ... en) º
(list (f e1) (f e2) ... (f en))
Tandis que la fonction
reduce obéit au schéma suivant:
(reduce f e (list e1 e2 ... en) º
(f e1 (f e2 ... (f en e) ... ))
Ces deux schémas matérialisent ce que l'on pense en utilisant
map et
reduce: on ne pense pas à leur définition mais à
leur effet: on utilise leur spécification.
Un peu de réflexion montre que
map ne peut calculer qu'une
liste de même taille que son entrée ainsi elle ne peut rassembler
(réduire) une liste de résultats en un unique résultat qui ne serait
pas une liste. En revanche,
reduce peut remplacer
map:
(define (map fn liste)
(define (combiner element resultat)
(cons (fn element) resultat) )
(reduce combiner '() liste) )
La réduction opère à partir de la liste vide et se contente de
combiner la valeur de l'application de la fonction unaire
f sur
l'élément courant devant la liste des autres résultats.
Ainsi
reduce permet-elle de retrouver
map. Mais il ne
s'ensuit pas qu'il faut utiliser
reduce en lieu et place de
map. Les deux schémas de pensée sont différents, traitent des
problèmes séparés et ne doivent être employés que dans leur domaine de
compétence.