Mapa (programování)

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 30. října 2018; kontroly vyžadují 7 úprav .

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

pak 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í.

Srovnání jazyků

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.

mapv různých jazycích

Mapa v různých jazycích
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>

Optimalizace

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

Poznámky

  1. „Fúze map: Zrychlení Haskellu o 225 %“ . Získáno 17. července 2011. Archivováno z originálu 6. srpna 2013.

Viz také