Précédent Suivant

  Comparaison d'itérateurs

 

 
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.




Précédent Suivant