map egy magasabb rendű függvény , amelyet számos programozási nyelvben használnak, és amely az argumentumlistájának minden elemére alkalmaz valamilyen függvényt, és eredménylistát állít elő visszatérési értékként. Ha funkcionális formában nézzük, gyakran „alkalmaz mindenkire” néven hivatkoznak rá .
Például, ha egy ilyen függvényt definiál square:
négyzet x = x * xakkor a hívás map square [1,2,3,4,5]egy listát ad vissza [1,4,9,16,25], mivel minden elemre mapalkalmazza a függvényt square, és ugyanabban a sorrendben gyűjti össze az eredményeket.
Egy függvény funkcionális programozásimap nyelvekből származik , de számos procedurális , objektum-orientált és többparadigmás nyelvben támogatott (vagy definiált), például: a C++ Standard Template Library -ben , a C#-ban (3.0) ábrázolva van. által . A funkciót gyakran használják olyan magas szintű nyelvekben is, mint a Perl , Python és Ruby ; mindhárom nyelven a függvény neve . Rubynak álneve is van a számára . A Common Lisp térképszerű funkciók egész családjával rendelkezik ; , az itt leírt viselkedésnek megfelelően (az utótag a CAR műveleten keresztüli hozzáférést jelenti ). Vannak nyelvek szintaktikai konstrukciókkal is, amelyek a . transformSelectmapmapcollectmapcarcarmap
Néha létezik egy általános verzió map, amely két argumentum, 2 lista függvényét veszi fel, és alkalmazza a listák megfelelő elemeire. Egyes nyelvek különleges neveket adnak nekik, például map2vagy zipWith. A mapkét vagy több listát tartalmazó függvények problémát jelentenek a különböző hosszúságú listákkal való munka során. A különböző nyelvek eltérően viselkednek: egyesek kivételt dobnak, mások megállnak, amikor egy rövid lista végét érik, és figyelmen kívül hagyják a hosszabb listák többi elemét, mások pedig a leghosszabbra mennek, és valamilyen speciális értéket adnak vissza azokhoz a listákhoz, amelyek értékei már véget értek.
Azon nyelveken, amelyek támogatják az első osztályú függvényeket , a curryinggelmap együtt használható olyan függvény biztosítására, amely előre meghatározott átalakítást hajt végre egy listán. Például a Haskellben egy függvény, amely egy listát ad vissza, amelynek minden eleme egyenlő az argumentumlista megfelelő elemével, négyzetesen. map square
Nyelv | Térkép | 2. térkép listák | Térkép n listák | Megjegyzések | Különböző hosszúságú listák viselkedése |
---|---|---|---|---|---|
Haskell | térkép funkció lista | zipWith funkcióval list1 list2 | zipWith n func list1 list2 ... | n a listák számának felel meg; zipWith7 -ig definiálva | a legrövidebb lista vége után megáll |
Haxe | Lambda.map ( iterálható , működő ) | ||||
J | func- lista | list func list | func / list1 , list2 , list3 , : list4 | A nyelv tömbkezelési képességei lehetővé teszik olyan funkciók implicit meghívását, mint például a map | A listáknak azonos hosszúságúaknak kell lenniük (hosszúság hiba, ha a listák nem egyenlőek) |
OCaml | List.map func list Array.map func array |
List.map2 func list1 list2 | Invalid_argument kivételt dob | ||
Szabványos ML | térkép funkció lista | ListPair.map func ( list1 , list2 ) ListPair.mapEq func ( list1 , list2 ) |
Két listából álló térkép esetén a func az elemeket sorként kapja meg . | A ListPair.map leáll, amikor eléri a legrövidebb lista végét, a ListPair.mapEq UnequalLengths kivételt dob | |
Piton | térkép ( funkció , lista ) | térkép ( func , list1 , list2 ) | térkép ( funkció , lista1 , lista2 ,…) | zip() és map() (3.x verzió) megáll a legrövidebb lista végén, a map() (2.x) és itertools.zip_longest() (3.x) a rövid listákat None értékekkel bővíti | |
rubin | enum .collect { block } enum .map { block } |
enum1 .zip( enum2 ).map { block } | enum1 .zip( enum2 , …).map { block } [ enum1 , enum2 , …].transpose.map { block } |
az enum egy enum | leáll, amikor eléri a függvényt meghívó lista végét (az első lista); ha bármely más lista rövidebb, akkor null értékkel bővül |
C++ | std::transform( kezdet , vége , eredmény , funkció ) | std::transform( kezdet1 , vége1 , kezdés2 , eredmény , függvény ) | a fejlécben az <algoritmus> kezdet , vége , és eredmény iterátorokban az eredmény az eredmény elejére lesz írva |
||
Perl | térképblokk lista térkép kif , lista _ |
A blokkban vagy a kifejezésben a $_ speciális érték tartalmazza a lista minden értékét. | N/A | ||
C# 3.0 | enum .Select( func ) | ||||
C# 4.0 | enum .Select( func ) | ienum1 .Zip( ienum2 , funkció ) | leáll, ha a legrövidebb lista végére ér | ||
JavaScript 1.6 | array .map( func ) | - | - | A map csak tömbmódszerként van megadva, így csak egy lista (tömb) alkalmazható | |
Közönséges Lisp | ( mapcar funkciólista ) | (mapcar func list1 list2 ) | (mapcar func list1 list2 ... ) | Leáll, ha a legrövidebb lista végére ér | |
Scheme , Clojure | ( térkép funkciólista ) | (map func list1 list2 ) | (map func list1 list2 ...) | Leáll, ha a legrövidebb lista végére ér | |
Csevej | aGyűjteménygyűjtés : aBlock | aCollection1 with: aCollection2 collection : aBlock | Leesik | ||
Erlang | listák: térkép ( Fun , List ) | listák: zipwith( Fun , List1 , List2 ) | zipwith3 is elérhető | A listáknak azonos hosszúságúaknak kell lenniük | |
PHP | array_map( visszahívás , tömb ) | array_map( visszahívás , tömb1 , tömb2 ) | array_map( visszahívás , tömb1 , tömb2 , ...) | A visszahívási argumentumok számának meg kell egyeznie a tömbök számával. |
bővítse ki a rövid listákat NULL értékekkel |
Mathematica | func /@ lista Térkép[ func , lista ] |
MapThread[ func , { list1 , list2 }] | MapThread[ func , { list1 , list2 , …}] | A listáknak azonos hosszúságúaknak kell lenniük | |
MATLAB | arrayfun ( funk, lista ) | arrayfun ( func, 1. lista , 2. lista ) | arrayfun ( func, 1. lista , ..., n . lista ) | cellfun a sejtlistákhoz | |
Maxima | map( f , expr 1 , …, expr n ) maplist( f , expr 1 , …, expr n ) |
||||
S / R | lapply ( lista , funkció ) | maply( func , lista1 , lista2 ) | mapply( func , lista1 , lista2 ,…) | A rövid listák ciklikusak | |
Scala | lista .map( func ) | ( list1 , list2 ).zipped.map( func ) | ( lista1 , lista2 "lista3").zipped.map( func ) | legfeljebb 3 lista. | leáll, amikor eléri a legrövidebb végét |
Java 8 | list.stream().map(func) | nincsenek első osztályú funkciók; interfész java.lang.A <T, R> függvény használatos |
A művelet matematikai alapja mapszámos optimalizálást tesz lehetővé . (map f . map g) xs(ahol a " " a függvényösszetétel. operátor ) egyenértékű a ; vagyis: . Ez az optimalizálás kiküszöböli a dupla hívás szükségességét a függvények és [1] alkalmazásának kombinálásával . map (f . g) xsmapfg
A funkciót a lista hajtogatásávalmap lehet meghatározni . Különösen, . A és kombinációja optimalizálható: ekvivalens , tehát . Egy ilyen megvalósítás , ha nem lusta nyelveken egyedileg linkelt listákkal használjuk , nem közvetlenül alkalmas a farok-rekurziós optimalizálásra (bár modulo cons ), így veremtúlcsorduláshoz vezethet, ha nagy listákra alkalmazzuk. . Sok nyelven létezik egy alternatív "fordított térképfüggvény", amely feladott lista esetén a térkép funkcióval egyenértékű, de a farokrekurzió optimalizálásának lehetőségével. Megvalósítás bal oldali hajtással: id xs = map id xs = foldr (:) [] xs = xsfoldmapfoldr f z . map gfoldr (f . g) zmap g xs = (id . map g) xs = foldr ((:) . g) [] xsmap
revMap f xs = foldl ( \ ys x -> f x : ys ) [ ] xs