Ensuite, appelez :
ce qui donne [1, 4, 9, 16, 25], démontrant que mapa parcouru toute la liste et a appliqué la fonction squareà chaque élément.
Exemple visuel
Ci-dessous, vous trouverez le détail de chaque étape du processus de conversion d'une liste d'entiers X = [0, 5, 8, 3, 2, 1]en une nouvelle liste X'selon la fonction.

Elle mapest fournie dans le cadre du prélude de base de Haskell (c'est-à-dire la « bibliothèque standard ») et est implémentée comme suit :
Généralisation
fmap::Functorf=>(a->b)->fa->fbFunctorLe constructeur de type des listes []peut être défini comme une instance de la Functorclasse de type en utilisant la mapfonction de l'exemple précédent :
Parmi les autres exemples, Functoron peut citer les arbres :
La cartographie d'un arbre donne :
Pour chaque instance de la Functorclasse de types, fmapest contractuellement tenu de respecter les lois des foncteurs :
où .désigne la composition de fonctions en Haskell.
Cela permet notamment de définir des opérations élément par élément pour différents types de collections .
Fondements de la théorie des catégories
En théorie des catégories , un foncteur
Les foncteurs peuvent également être des objets de catégories, les « morphismes » étant appelés transformations naturelles . Étant donné deux foncteurs::Treea->ListasortBy::(a->a->Bool)->Lista->Lista
Optimisations
Les fondements mathématiques des cartes permettent un certain nombre d' optimisations . La loi de composition garantit que les deux
(map f . map g) listetmap (f . g) list
aboutissent au même résultat ; c'est-à-dire,
Les fonctions de mappage peuvent être et sont souvent définies en termes de pliage tel que foldr, ce qui signifie que l'on peut effectuer une fusion map-pli : foldr f z . map gest équivalent à foldr (f . g) z.
L'implémentation de `map` ci-dessus sur les listes simplement chaînées n'est pas récursive terminale ; par conséquent, elle peut accumuler de nombreux cadres sur la pile lorsqu'elle est appelée avec une grande liste. De nombreux langages proposent une fonction alternative de « map inverse », équivalente à l'inversion d'une liste mappée, mais récursive terminale. Voici une implémentation qui utilise la fonction `fold -left`.
Étant donné que l'inversion d'une liste simplement chaînée est également récursive terminale, reverse et reverse-map peuvent être composés pour effectuer une map normale de manière récursive terminale, bien que cela nécessite d'effectuer deux passages sur la liste.
Comparaison linguistique
La fonction map trouve son origine dans les langages de programmation fonctionnelle .
Le langage Lisp a introduit une fonction map appelée maplist en 1959, avec des versions légèrement différentes déjà apparues en 1958. Voici la définition originale de maplist, qui applique une fonction sur des listes de restes successives :
La fonctionmaplistest toujours disponible dans les Lisp plus récents comme Common Lisp , bien que des fonctions commemapcarou les plus génériquesmapseraient préférées.L'élévation au carré des éléments d'une liste
maplists'écrirait en notation S-expression comme ceci :( maplist ( lambda ( l ) ( sqr ( voiture l ))) ' ( 1 2 3 4 5 ))En utilisant cette fonction
mapcar, l'exemple ci-dessus s'écrirait comme ceci :( mapcar ( fonction sqr ) ' ( 1 2 3 4 5 ))Aujourd'hui, les fonctions de mappage sont prises en charge (ou peuvent être définies) dans de nombreux langages procéduraux , orientés objet et multi-paradigmes : dans la bibliothèque standard de C++ , elles sont appelées ` map` ou ` map` , et dans la bibliothèque LINQ de C# (3.0), elles sont fournies comme méthode d'extension appelée ` map`. L'opération `map` est également fréquemment utilisée dans les langages de haut niveau tels que CFML , Perl , Python et Ruby ; elle est appelée `map` dans ces quatre langages. Un alias pour `map` est également fourni en Ruby (via Smalltalk ). Common Lisp propose une famille de fonctions similaires à `map` ; celle correspondant au comportement décrit ici est appelée `map` ( indiquant un accès via l' opération CAR ). Il existe également des langages avec des constructions syntaxiques offrant la même fonctionnalité que la fonction `map`.
std::transformstd::ranges::transformSelectmapcollectmapmapcar-carLa fonction `map` est parfois généralisée pour accepter des fonctions dyadiques (à deux arguments) qui appliquent une fonction fournie par l'utilisateur aux éléments correspondants de deux listes. Certains langages utilisent des noms spécifiques pour cela, tels que `map2` ou `zipWith` . Les langages utilisant des fonctions variadiques explicites peuvent proposer des versions de `map` à arité variable pour prendre en charge ce type de fonctions. L'utilisation de `map` avec deux listes ou plus pose le problème de la gestion des listes de longueurs différentes. Les langages adoptent des comportements variés à ce sujet. Certains lèvent une exception. D'autres s'arrêtent à la longueur de la liste la plus courte et ignorent les éléments supplémentaires des autres listes. D'autres encore continuent jusqu'à la longueur de la liste la plus longue et, pour les listes déjà traitées, passent une valeur d'espace réservé à la fonction pour indiquer qu'aucune valeur n'est attendue.
Dans les langages qui prennent en charge les fonctions de première classe et la curryfication ,
mapon peut partiellement appliquer cette méthode pour transformer une fonction qui ne fonctionne que sur une seule valeur en un équivalent élément par élément qui fonctionne sur un conteneur entier ; par exemple, `map squareis` est une fonction Haskell qui met au carré chaque élément d'une liste.