map je funkce vyššího řádu používaná v mnoha programovacích jazycích , která aplikuje nějakou funkci na každý prvek seznamu svých argumentů a vytváří seznam výsledků jako návratovou hodnotu. Když je viděn ve funkční formě, je často označován jako „použít pro všechny“ .
Pokud například definujete funkci squaretakto:
čtverec x = x * xpak volání map square [1,2,3,4,5]vrátí seznam [1,4,9,16,25], protože mappoužije funkci squarena každý prvek a shromáždí výsledky ve stejném pořadí.
Funkce mappochází z funkcionálních programovacích jazyků , ale je podporována (nebo definována) v mnoha procedurálních , objektově orientovaných a multiparadigmatických jazycích, například: v C++ Standard Template Library se nazývá , v C# (3.0) je reprezentována od . Funkce se také často používá v jazycích na vysoké úrovni, jako je Perl , Python a Ruby ; ve všech třech jazycích se funkce nazývá . Ruby má také alias pro . Common Lisp má celou rodinu funkcí podobných mapám; , odpovídající zde popsanému chování (přípona znamená přístup přes provoz CAR ). Existují také jazyky s konstrukcemi syntaxe, které poskytují funkce podobné . transformSelectmapmapcollectmapcarcarmap
Někdy existuje obecná verze map, která přebírá funkci dvou argumentů, 2 seznamů a aplikuje ji na odpovídající prvky seznamů. Některé jazyky jim dávají speciální názvy jako map2nebo zipWith. Funkce mapse dvěma nebo více seznamy vyvolává problém při práci se seznamy různých délek. Různé jazyky se chovají odlišně: některé vyvolávají výjimku, jiné se zastaví, když se dosáhne konce krátkého seznamu a ignorují zbytek prvků delších seznamů, další přejdou na nejdelší a vrátí nějakou speciální hodnotu pro seznamy, jejichž hodnoty již skončily.
V jazycích, které podporují prvotřídní funkce , maplze s curryingem poskytnout funkci, která provádí předdefinovanou transformaci na seznamu. Například map squarev Haskell, funkce, která vrací seznam, jehož každý prvek je roven odpovídajícímu prvku seznamu argumentů, na druhou.
Jazyk | Mapa | Mapa 2 seznamy | Mapa n seznamů | Poznámky | Chování pro seznamy různých délek |
---|---|---|---|---|---|
Haskell | seznam funkcí mapy | zipS funkcí seznam1 seznam2 | zipWith n func list1 seznam2 ... | n odpovídá počtu seznamů; definované až do zipWith7 | zastaví po konci nejkratšího seznamu |
Haxe | Lambda.map( iterovatelné , func ) | ||||
J | seznam funkcí | seznam func seznam | func / list1 , seznam2 , seznam3 , : seznam4 | Schopnosti jazyka pro zpracování pole vám umožňují implicitně volat funkce, jako je map | Seznamy musí mít stejnou délku (chyba délky, pokud se seznamy nerovnají) |
OCaml | Seznam.map func seznam Array.map func pole |
Seznam.map2 func seznam1 seznam2 | vyvolá výjimku Invalid_argument | ||
Standardní ML | seznam funkcí mapy | ListPair.map func ( list1 , list2 ) ListPair.mapEq func ( list1 , list2 ) |
Pro mapu dvou seznamů získá func prvky jako n-tici . | ListPair.map se zastaví, když dosáhne konce nejkratšího seznamu, ListPair.mapEq vyvolá výjimku UnequalLengths | |
Krajta | mapa ( funkce , seznam ) | map( func , list1 , list2 ) | map( func , list1 , list2 , …) | zip() a map() (verze 3.x) končí na konci nejkratšího seznamu, map() (2.x) a itertools.zip_longest() (3.x) rozšiřují krátké seznamy s hodnotami Žádné | |
rubín | enum .collect { block } enum .map { block } |
enum1 .zip( enum2 ).map { blok } | enum1 .zip( enum2 , …).map { block } [ enum1 , enum2 , …].transpose.map { block } |
enum je enum | zastaví se, když dosáhne konce seznamu, na kterém je funkce volána (první seznam); pokud je jakýkoli jiný seznam kratší, rozšíří se o nulové hodnoty |
C++ | std::transform( begin , end , result , func ) | std::transform( begin1 , end1 , begin2 , result , func ) | v záhlaví <algorithm> begin , end , & result iterators bude výsledek zapsán na začátek result |
||
Perl | seznam mapových bloků mapa expr , seznam |
V block nebo expr obsahuje speciální hodnota $_ každou hodnotu v seznamu. | N/A | ||
C# 3.0 | enum .Select( func ) | ||||
C# 4.0 | enum .Select( func ) | ienum1 .Zip( ienum2 , func ) | zastaví, když je dosaženo konce nejkratšího seznamu | ||
JavaScript 1.6 | pole .map( func ) | - | - | map je poskytován pouze jako metoda pole, takže lze použít pouze jeden seznam (pole). | |
Lisp obecný | ( seznam funkcí mapcar ) | (mapcar func list1 list2 ) | (mapcar func list1 list2 ... ) | Zastaví se, když je dosaženo konce nejkratšího seznamu | |
Schéma , Clojure | ( seznam funkcí mapy ) | (map func list1 list2 ) | (map func list1 list2 ...) | Zastaví se, když je dosaženo konce nejkratšího seznamu | |
Pokec | a Collection Collect : aBlock | aCollection1 with: aCollection2 collect: aBlock | Padání | ||
Erlang | seznamy: mapa ( Zábava , Seznam ) | seznamy: zipwith( Fun , List1 , List2 ) | zipwith3 je také k dispozici | Seznamy musí být stejně dlouhé | |
PHP | array_map( zpětné volání , pole ) | array_map( zpětné volání , pole1 , pole2 ) | array_map( zpětné volání , pole1 , pole2 , ...) | Počet argumentů zpětného volání musí odpovídat počtu polí. |
rozšířit krátké seznamy o hodnoty NULL |
Mathematica | func /@ seznam Mapa[ func , seznam ] |
MapThread[ func , { seznam1 , seznam2 }] | MapThread[ func , { seznam1 , seznam2 , …}] | Seznamy musí být stejně dlouhé | |
MATLAB | arrayfun ( func, list ) | arrayfun ( func, seznam 1 , seznam 2 ) | arrayfun ( func, seznam 1 , ..., seznam n ) | cellfun pro seznamy buněk | |
Maxima | map( f , expr 1 , …, expr n ) maplist( f , expr 1 , …, expr n ) |
||||
S / R | lapply( seznam , func ) | mapply( func , list1 , list2 ) | mapply( func , list1 , list2 ,…) | Krátké seznamy jsou cyklické | |
Scala | seznam .map( func ) | ( seznam1 , seznam2 ).zipped.map( func ) | ( seznam1 , seznam2 ,,seznam3“).zipped.map( func ) | ne více než 3 seznamy. | zastaví, když dosáhne konce nejkratšího |
Java 8 | list.stream().map(func) | žádné prvotřídní funkce; používá se rozhraní java.lang.Function<T, R> |
Matematický základ operace mapumožňuje mnoho optimalizací . (map f . map g) xs(kde " " je .operátor složení funkce ) je ekvivalentní map (f . g) xs ; to je: . Tato optimalizace eliminuje potřebu dvojitého volání kombinací aplikace funkcí a [1] . mapfg
Funkci maplze definovat pomocí list fold . Zejména id xs = map id xs = foldr (:) [] xs = xs. Kombinaci folda maplze optimalizovat: foldr f z . map gekvivalentní foldr (f . g) z, tedy map g xs = (id . map g) xs = foldr ((:) . g) [] xs. Taková implementace mappři použití s jednoduše propojenými seznamy v nelíných jazycích není přímo přístupná optimalizaci rekurze na konci (ačkoli je modulo cons ) optimalizovatelná, takže při použití na velké seznamy může vést k přetečení zásobníku. . V mnoha jazycích existuje alternativní „funkce obrácené mapy“, která je ekvivalentní funkci mapy v případě zveřejněného seznamu, ale s možností optimalizace rekurze ocasu. Implementace pomocí levého záhybu:
revMap f xs = foldl ( \ ys x -> f x : ys ) [] xs