map är en högre ordningsfunktion som används i många programmeringsspråk som tillämpar någon funktion på varje element i listan över dess argument, och producerar en lista med resultat som returvärde. När det ses i funktionell form kallas det ofta för "tillämpa-på-alla" .
Till exempel, om du definierar en funktion squareså här:
kvadrat x = x * xdå kommer anropet map square [1,2,3,4,5]att returnera en lista [1,4,9,16,25]eftersom det kommer att maptillämpa funktionen squarepå varje element och samla resultaten i samma ordning.
En funktion maphärstammar från funktionella programmeringsspråk , men stöds (eller definieras) i många procedur- , objektorienterade och multiparadigmspråk , till exempel: i C++ Standard Template Library kallas den , i C# (3.0) representeras den. av . Funktionen används också ofta i högnivåspråk som Perl , Python och Ruby ; på alla tre språken heter funktionen . Ruby har också ett alias för . Common Lisp har en hel familj av kartliknande funktioner; , motsvarande beteendet som beskrivs här (suffixet betyder åtkomst via CAR-operationen ). Det finns också språk med syntaxkonstruktioner som ger funktionalitet som liknar . transformSelectmapmapcollectmapcarcarmap
Ibland finns det en generisk version mapsom tar en funktion av två argument, 2 listor, och tillämpar den på motsvarande element i listorna. Vissa språk ger dem speciella namn som map2eller zipWith. En funktion mapmed två eller flera listor ger upphov till problemet att arbeta med listor av olika längd. Olika språk beter sig olika: vissa gör ett undantag, andra slutar när slutet av en kort lista nås och ignorerar resten av elementen i längre listor, andra går till den längsta och returnerar något speciellt värde för listor vars värden har redan tagit slut.
På språk som stöder förstklassiga funktioner , mapkan användas med currying för att tillhandahålla en funktion som utför en fördefinierad transformation på en lista. Till exempel, map squarei Haskell, en funktion som returnerar en lista, vars varje element är lika med motsvarande element i argumentlistan, i kvadrat.
Språk | Karta | Karta 2 listor | Karta n listor | Anteckningar | Beteende för listor med olika längder |
---|---|---|---|---|---|
Haskell | kartfunktionslista _ _ | zipMed func list1 list2 | zipWith n func list1 list2 ... | n motsvarar antalet listor; definieras upp till zipWith7 | stoppar efter slutet av den kortaste listan |
Haxe | Lambda.map ( iterable , func ) | ||||
J | funktionslista _ | lista funk lista | func / list1 , list2 , list3 , : list4 | Språkets arrayhanteringsfunktioner låter dig implicit anropa funktioner som karta | Listor måste vara lika långa (längdfel om listor inte är lika) |
Ocaml | List.map func list Array.map func array |
List.map2 func list1 list2 | kastar ett Invalid_argument-undantag | ||
Standard ML | kartfunktionslista _ _ | ListPair.map func ( list1 , list2 ) ListPair.mapEq func ( list1 , list2 ) |
För en karta över två listor får func elementen som en tupel . | ListPair.map stannar när den når slutet av den kortaste listan, ListPair.mapEq kastar ett UnequalLengths-undantag | |
Pytonorm | karta ( func , lista ) | map( func , list1 , list2 ) | map( func , list1 , list2 , …) | zip() och map() (version 3.x) stannar i slutet av den kortaste listan, map() (2.x) och itertools.zip_longest() (3.x) expanderar korta listor med None- värden | |
rubin | enum .collect { block } enum .map { block } |
enum1 .zip( enum2 ).map { block } | enum1 .zip( enum2 , …).map { block } [ enum1 , enum2 , …].transpose.map { block } |
enum är en enum | slutar när den når slutet av listan där funktionen anropas (den första listan); om någon annan lista är kortare utökas den med nollvärden |
C++ | std::transform( start , end , result , func ) | std::transform( start1 , end1 , begin2 , result , func ) | i rubriken <algorithm> start , end , & resultat iteratorer kommer resultatet att skrivas till början av resultatet |
||
Perl | map block list map expr , list |
I block eller expr innehåller specialvärdet $_ varje värde i listan. | N/A | ||
C# 3.0 | enum .Select( func ) | ||||
C# 4.0 | enum .Select( func ) | ienum1 .Zip( ienum2 , func ) | stoppar när slutet av den kortaste listan nås | ||
JavaScript 1.6 | array .map( func ) | - | - | map tillhandahålls endast som en arraymetod, så endast en lista (array) kan tillämpas | |
Vanlig Lisp | (mapcar func lista ) | (mapcar func list1 list2 ) | (mapcar func list1 list2 ... ) | Stoppar när slutet av den kortaste listan nås | |
Scheme , Clojure | ( kartfunktionslista ) _ | (map func list1 list2 ) | (karta func list1 list2 ...) | Stoppar när slutet av den kortaste listan nås | |
Småprat | aCollection collect: aBlock | aCollection1 med: aCollection2 collect: aBlock | Ramlar ner | ||
Erlang | listor: map( Fun , List ) | lists: zipwith( Fun , List1 , List2 ) | zipwith3 är också tillgänglig | Listor måste vara lika långa | |
PHP | array_map( callback , array ) | array_map( callback , array1 , array2 ) | array_map( callback , array1 , array2 , ...) | Antalet callback- argument måste matcha antalet arrayer. |
expandera korta listor med NULL- värden |
Mathematica | func /@ list Karta[ func , list ] |
MapThread[ func , { list1 , list2 }] | MapThread[ func , { list1 , list2 , …}] | Listor måste vara lika långa | |
MATLAB | arrayfun ( func, lista ) | arrayfun ( func, lista 1 , lista 2 ) | arrayfun ( func, lista 1 , ..., lista n ) | cellfun för celllistor | |
Maxima | map( f , expr 1 , …, expr n ) maplist( f , expr 1 , …, expr n ) |
||||
S / R | lapply( lista , func ) | mapply( func , list1 , list2 ) | mapply( func , list1 , list2 ,...) | Korta listor är cykliska | |
Scala | list .map( func ) | ( list1 , list2 ).zipped.map( func ) | ( list1 , list2 , "list3").zipped.map( func ) | inte mer än 3 listor. | stannar när den når slutet av den kortaste |
Java 8 | list.stream().map(func) | inga förstklassiga funktioner; gränssnitt java.lang.Function<T, R> används |
Den matematiska grunden för operationen mapmöjliggör många optimeringar . (map f . map g) xs(där " " är funktionssammansättningsoperatorn. ) är ekvivalent med ; det vill säga: . Denna optimering eliminerar behovet av ett dubbelsamtal genom att kombinera tillämpningen av funktioner och [1] . map (f . g) xsmapfg
Funktionen mapkan definieras med listfoldning . I synnerhet, id xs = map id xs = foldr (:) [] xs = xs. Kombinationen av foldoch mapkan optimeras: foldr f z . map gmotsvarar foldr (f . g) z, alltså map g xs = (id . map g) xs = foldr ((:) . g) [] xs. En sådan implementering map, när den används med enkellänkade listor i icke - lata språk, är inte direkt mottaglig för optimering av svansrekursion (även om den är modulo cons ) optimerbar, så den kan leda till ett stackspill om det tillämpas på stora listor . På många språk finns en alternativ "omvänd kartfunktion", som är likvärdig med kartfunktionen vid en postad lista, men med möjlighet att optimera svansrekursionen. Implementering med vänstervikning:
revMap f xs = foldl ( \ ys x -> f x : ys ) [] xs