map er en højere-ordens funktion, der bruges i mange programmeringssprog, der anvender en eller anden funktion til hvert element i listen over dets argumenter, hvilket producerer en liste over resultater som returværdi. Når det ses i funktionel form, omtales det ofte som "anvend-på-alle" .
For eksempel, hvis du definerer en funktion squaresom denne:
kvadrat x = x * xmap square [1,2,3,4,5]så returnerer opkaldet en liste [1,4,9,16,25], da det vil mapanvende funktionen squarepå hvert element og samle resultaterne i samme rækkefølge.
En funktion mapstammer fra funktionelle programmeringssprog , men er understøttet (eller defineret) i mange procedure- , objektorienterede og multiparadigmesprog , for eksempel: i C++ Standard Template Library kaldes den , i C# (3.0) er den repræsenteret af . Funktionen bruges også ofte i sprog på højt niveau som Perl , Python og Ruby ; på alle tre sprog hedder funktionen . Ruby har også et alias for . Almindelig Lisp har en hel familie af kortlignende funktioner; , svarende til den her beskrevne adfærd (suffikset betyder adgang via CAR-operationen ). Der er også sprog med syntakskonstruktioner, der giver funktionalitet svarende til . transformSelectmapmapcollectmapcarcarmap
Nogle gange er der en generisk version map, der tager en funktion af to argumenter, 2 lister, og anvender den på de tilsvarende elementer i listerne. Nogle sprog giver dem specielle navne som map2eller zipWith. En funktion mapmed to eller flere lister giver anledning til problemet med at arbejde med lister af forskellig længde. Forskellige sprog opfører sig forskelligt: nogle afgiver en undtagelse, andre stopper, når slutningen af en kort liste er nået og ignorerer resten af elementerne på længere lister, atter andre går til den længste og returnerer en speciel værdi for lister, hvis værdier allerede er afsluttet.
På sprog, der understøtter førsteklasses funktioner , mapkan bruges med currying for at give en funktion, der udfører en foruddefineret transformation på en liste. For eksempel map squarei Haskell, en funktion, der returnerer en liste, hvis hvert element er lig med det tilsvarende element i argumentlisten, i kvadrat.
Sprog | Kort | Kort 2 lister | Kort n lister | Noter | Adfærd for Lister af forskellige Længder |
---|---|---|---|---|---|
Haskell | kort funktionsliste _ | zipMed func liste1 liste2 | zipWith n func liste1 liste2 ... | n svarer til antallet af lister; defineret op til zipWith7 | stopper efter slutningen af den korteste liste |
Haxe | Lambda.map( iterable , func ) | ||||
J | funktionsliste _ | liste funktionsliste _ | func / list1 , list2 , list3 , : list4 | Sprogets matrixhåndteringsfunktioner giver dig mulighed for implicit at kalde funktioner såsom kort | Lister skal have samme længde (længdefejl, hvis lister ikke er ens) |
OKaml | List.map func liste Array.map func array |
Liste.kort2 funktionsliste1 liste2 _ | kaster en Invalid_argument undtagelse | ||
Standard ML | kort funktionsliste _ | ListPair.map func ( liste1 , liste2 ) ListPair.mapEq func ( liste1 , liste2 ) |
For et kort med to lister får func elementerne som en tupel . | ListPair.map stopper, når den når slutningen af den korteste liste, ListPair.mapEq kaster en UnequalLengths-undtagelse | |
Python | kort ( func , liste ) | map( func , liste1 , liste2 ) | kort ( func , liste1 , liste2 , …) | zip() og map() (version 3.x) stopper i slutningen af den korteste liste, map() (2.x) og itertools.zip_longest() (3.x) udvider korte lister med None -værdier | |
rubin | enum .collect { blok } enum .map { blok } |
enum1 .zip( enum2 ).map { blok } | enum1 .zip( enum2 , …).map { blok } [ enum1 , enum2 , …].transpose.map { blok } |
enum er en enum | stopper, når den når slutningen af den liste, hvorpå funktionen kaldes (den første liste); hvis en anden liste er kortere, udvides den med nul- værdier |
C++ | std::transform( start , end , result , func ) | std::transform( start1 , end1 , begin2 , result , func ) | i headeren <algoritme> start , end , & resultat iteratorer vil resultatet blive skrevet til begyndelsen af resultatet |
||
Perl | kortblokliste kortudtr , liste _ _ _ |
I blok eller udtr , indeholder den specielle værdi $_ hver værdi på listen. | N/A | ||
C# 3.0 | enum .Select( func ) | ||||
C# 4.0 | enum .Select( func ) | ienum1 .Zip( ienum2 , func ) | stopper, når slutningen af den korteste liste nås | ||
JavaScript 1.6 | array .map( func ) | - | - | map leveres kun som en matrixmetode, så kun én liste (array) kan anvendes | |
Almindelig Lisp | ( mapcar funktionsliste ) | (mapcar func liste1 liste2 ) | (mapcar func liste1 liste2 ... ) | Stopper, når slutningen af den korteste liste nås | |
Scheme , Clojure | ( kortfunktionsliste ) _ | ( kortfunktionsliste1 liste2 ) _ | ( kortfunktionsliste1 liste2 ... ) | Stopper, når slutningen af den korteste liste nås | |
Småsnak | aCollection collect: aBlock | aCollection1 med: aCollection2 collect: aBlok | Falder ned | ||
Erlang | lister: kort( Sjov , Liste ) | lister: zipwith( Sjov , Liste1 , Liste2 ) | zipwith3 er også tilgængelig | Listerne skal have samme længde | |
PHP | array_map( tilbagekald , array ) | array_map( tilbagekald , array1 , array2 ) | array_map( tilbagekald , array1 , array2 , ...) | Antallet af tilbagekaldsargumenter skal svare til antallet af arrays
. |
udvide korte lister med NULL- værdier |
Mathematica | func /@ liste Kort[ func , liste ] |
MapThread[ func , { liste1 , liste2 }] | MapThread[ func , { liste1 , liste2 , …}] | Listerne skal have samme længde | |
MATLAB | arrayfun ( func, liste ) | arrayfun ( func, liste 1 , liste 2 ) | arrayfun ( func, liste 1 , ..., liste n ) | cellfun til cellelister | |
Maxima | map( f , expr 1 , …, expr n ) maplist( f , expr 1 , …, expr n ) |
||||
S / R | lapply ( liste , func ) | maply( func , liste1 , liste2 ) | mapply( func , liste1 , liste2 ,...) | Korte lister er cykliske | |
Scala | liste .map( func ) | ( liste1 , liste2 ).zipped.map( func ) | ( liste1 , liste2 , "liste3").zipped.map( func ) | ikke mere end 3 lister. | stopper, når den når slutningen af den korteste |
Java 8 | list.stream().map(func) | ingen førsteklasses funktioner; interface java.lang.Function<T, R> bruges |
Det matematiske grundlag for operationen mapgiver mulighed for mange optimeringer . (map f . map g) xs(hvor " " .er funktionssammensætningsoperatoren ) svarer til map (f . g) xs ; det vil sige :. Denne optimering eliminerer behovet for et dobbeltkald ved at kombinere anvendelsen af funktioner og [1] . mapfg
Funktionen mapkan defineres ved hjælp af listefoldning . Især id xs = map id xs = foldr (:) [] xs = xs. Kombinationen af foldog mapkan optimeres: foldr f z . map gsvarende til foldr (f . g) z, således map g xs = (id . map g) xs = foldr ((:) . g) [] xs. En sådan implementering maper, når den bruges med enkeltlinkede lister i ikke - dovne sprog, ikke direkte modtagelig for hale-rekursionsoptimering (selvom den er modulo cons ) optimerbar, så den kan føre til et stackoverløb, hvis det anvendes på store lister . På mange sprog findes der en alternativ "omvendt kortfunktion", som svarer til kortfunktionen i tilfælde af en opslået liste, men med mulighed for at optimere halerekursion. Implementering ved hjælp af venstre fold:
revMap f xs = foldl ( \ ys x -> f x : ys ) [] xs