Térkép (programozás)

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2018. október 30-án áttekintett verziótól ; az ellenőrzések 7 szerkesztést igényelnek .

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

akkor 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.

Nyelvek összehasonlítása

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

mapkülönböző nyelveken

Térkép különböző nyelveken
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

Optimalizálások

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

Jegyzetek

  1. "Térképfúzió: A Haskell 225%-kal gyorsabbá tétele" . Letöltve: 2011. július 17. Az eredetiből archiválva : 2013. augusztus 6..

Lásd még