map este o funcție de ordin superior folosită în multe limbaje de programare care aplică o anumită funcție fiecărui element din lista argumentelor sale, producând o listă de rezultate ca valoare returnată. Când este vizualizat în formă funcțională, este adesea denumit „aplicați tuturor” .
De exemplu, dacă definiți o funcție squareca aceasta:
pătrat x = x * xapoi apelul map square [1,2,3,4,5]va returna o listă [1,4,9,16,25], deoarece va mapaplica funcția squarefiecărui element, colectând rezultatele în aceeași ordine.
O funcție mapprovine din limbaje de programare funcționale , dar este suportată (sau definită) în multe limbaje procedurale , orientate pe obiecte și multi- paradigma , de exemplu: în biblioteca de șabloane standard C++ se numește transform, în C# (3.0) este reprezentată de către Select. Funcția este, de asemenea, frecvent utilizată în limbaje de nivel înalt, cum ar fi Perl , Python și Ruby ; în toate cele trei limbi funcția se numește map. Ruby mapare și un alias pentru collect. Common Lisp are o întreagă familie de funcții asemănătoare hărții; mapcar, corespunzător comportamentului descris aici (sufixul carînseamnă acces prin operațiunea CAR ). Există, de asemenea, limbaje cu constructe de sintaxă care oferă funcționalități similare cu map.
Uneori există o versiune generică mapcare preia o funcție a două argumente, 2 liste, și o aplică elementelor corespunzătoare din liste. Unele limbi le dau nume speciale precum map2sau zipWith. O funcție mapcu două sau mai multe liste dă naștere la problema lucrului cu liste de lungimi diferite. Diferite limbi se comportă diferit: unele fac o excepție, altele se opresc când se ajunge la sfârșitul unei liste scurte și ignoră restul elementelor listelor mai lungi, altele merg la cea mai lungă, returnând o anumită valoare specială pentru listele ale căror valori s-au terminat deja.
În limbile care acceptă funcții de primă clasă , mappoate fi folosit cu curry pentru a oferi o funcție care efectuează o transformare predefinită pe o listă. De exemplu, map squareîn Haskell, o funcție care returnează o listă, fiecare element fiind egal cu elementul corespunzător din lista de argumente, la pătrat.
Limba | Hartă | Harta 2 liste | Harta n liste | Note | Comportament pentru liste de lungimi diferite |
---|---|---|---|---|---|
Haskell | lista funcțiilor hărții | zipCu func list1 list2 | zipCu n func list1 list2 ... | n corespunde numărului de liste; definit până la zipWith7 | se oprește după sfârșitul celei mai scurte liste |
Haxe | Lambda.map( iterabil , func ) | ||||
J | func- listă | list func list | func / list1 , list2 , list3 , : list4 | Capacitățile de gestionare a matricei ale limbajului vă permit să apelați implicit funcții precum map | Listele trebuie să aibă aceeași lungime (eroare de lungime dacă listele nu sunt egale) |
OCaml | List.map func list Array.map func array |
List.map2 func list1 list2 | aruncă o excepție Invalid_argument | ||
ML standard | lista funcțiilor hărții | ListPair.map func ( list1 , list2 ) ListPair.mapEq func ( list1 , list2 ) |
Pentru o hartă cu două liste, func primește elementele ca un tuplu . | ListPair.map se oprește când ajunge la sfârșitul celei mai scurte liste, ListPair.mapEq aruncă o excepție UnequalLengths | |
Piton | harta ( functie , lista ) | hartă( func , list1 , list2 ) | map( func , list1 , list2 , …) | zip() și map() (versiunea 3.x) se opresc la sfârșitul celei mai scurte liste, map() (2.x) și itertools.zip_longest() (3.x) extind listele scurte cu valorile None | |
rubin | enum .collect { block } enum .map { block } |
enum1 .zip( enum2 ).map { block } | enum1 .zip( enum2 , …).map { block } [ enum1 , enum2 , …].transpose.map { block } |
enum este o enum | se oprește când ajunge la sfârșitul listei pe care este apelată funcția (prima listă); dacă orice altă listă este mai scurtă, se extinde cu valori zero |
C++ | std::transform( început , sfârșit , rezultat , func ) | std::transform( begin1 , end1 , begin2 , rezultat , func ) | în antetul <algoritm> begin , end și iteratorii rezultat rezultatul va fi scris la începutul rezultatului |
||
Perl | hartă block list map expr , listă |
În bloc sau expr , valoarea specială $_ conține fiecare valoare din listă. | N / A | ||
C# 3.0 | enum .Select( func ) | ||||
C# 4.0 | enum .Select( func ) | ienum1 .Zip ( ienum2 , func ) | se oprește când se ajunge la sfârșitul celei mai scurte liste | ||
JavaScript 1.6 | matrice .map( func ) | - | - | harta este furnizată doar ca metodă de matrice, deci poate fi aplicată o singură listă (matrice). | |
Lisp comun | ( listă funcții mapcar ) | (mapcar func list1 list2 ) | (mapcar func list1 list2 ... ) | Se oprește când se ajunge la sfârșitul celei mai scurte liste | |
Scheme , Clojure | ( listă funcții hărți ) | (Hartă func list1 list2 ) | (Hartă func list1 list2 ...) | Se oprește când se ajunge la sfârșitul celei mai scurte liste | |
Convorbire scurtă | aColectie colectare: aBlock | aColecție1 cu: aColecție2 colectează: aBlock | Prăvălire | ||
Erlang | liste: hartă ( distracție , listă ) | liste: zipwith( Fun , List1 , List2 ) | zipwith3 este, de asemenea, disponibil | Listele trebuie să aibă aceeași lungime | |
PHP | array_map( callback , array ) | array_map( callback , array1 , array2 ) | array_map( callback , array1 , array2 , ...) | Numărul de argumente de apel invers trebuie să se potrivească cu numărul de matrice. |
extinde liste scurte cu valori NULL |
Mathematica | func /@ list Harta[ func , list ] |
MapThread[ func , { list1 , list2 }] | MapThread[ func , { list1 , list2 , …}] | Listele trebuie să aibă aceeași lungime | |
MATLAB | arrayfun ( funcție , listă ) | arrayfun ( functie , lista 1 , lista 2 ) | arrayfun ( functie , lista 1 , ..., lista n ) | cellfun pentru liste de celule | |
Maxima | map( f , expr 1 , …, expr n ) maplist( f , expr 1 , …, expr n ) |
||||
S / R | lapply( listă , func ) | mapply( func , list1 , list2 ) | mapply( func , list1 , list2 ,...) | Listele scurte sunt ciclice | |
Scala | listă .map( func ) | ( list1 , list2 ).zipped.map( func ) | ( list1 , list2 ,"list3").zipped.map( func ) | nu mai mult de 3 liste. | se oprește când ajunge la capătul celui mai scurt |
Java 8 | list.stream().map(func) | fără funcții de primă clasă; se folosește interfața java.lang.Function<T, R> |
Baza matematică a operației mappermite multe optimizări . (map f . map g) xs(unde „ ” este .operatorul de compoziție a funcției ) este echivalent cu map (f . g) xs ; adică: . Această optimizare elimină necesitatea unui apel dublu prin combinarea aplicării funcțiilor și [1] . mapfg
Funcția mappoate fi definită folosind list fold . În special, id xs = map id xs = foldr (:) [] xs = xs. Combinația dintre foldși mappoate fi optimizată: foldr f z . map gechivalent cu foldr (f . g) z, astfel map g xs = (id . map g) xs = foldr ((:) . g) [] xs. O astfel de implementare map, atunci când este utilizată cu liste conectate unic în limbi non - lene , nu este direct susceptibilă de optimizarea recursiunii de coadă (deși este modul cons ) optimizabilă, astfel încât poate duce la o depășire a stivei dacă este aplicată listelor mari. . În multe limbi, există o „funcție de hartă inversată” alternativă, care este echivalentă cu funcția de hartă în cazul unei liste postate, dar cu posibilitatea de optimizare a recursiunii cozii. Implementare folosind fold stânga:
revMap f xs = foldl ( \ ys x -> f x : ys ) [] xs