Harta (programare)

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 30 octombrie 2018; verificările necesită 7 modificări .

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 * x

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

Comparația limbilor

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.

mapîn diferite limbi

Hartă în diferite limbi
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>

Optimizări

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

Note

  1. „Map fusion: Making Haskell 225% maister” . Preluat la 17 iulie 2011. Arhivat din original la 6 august 2013.

Vezi și