map on korkeamman asteen funktio , jota käytetään monissa ohjelmointikielissä ja joka käyttää jotakin funktiota jokaiseen argumenttiluettelonsa elementtiin ja tuottaa tulosluettelon palautusarvona. Kun sitä tarkastellaan toiminnallisessa muodossa, sitä kutsutaan usein "sovellettavaksi kaikille" .
Jos esimerkiksi määrität funktion squarenäin:
neliö x = x * xsilloin puhelu map square [1,2,3,4,5]palauttaa luettelon [1,4,9,16,25], koska se käyttää mapfunktiota squarejokaiseen elementtiin ja kerää tulokset samassa järjestyksessä.
Funktio mapon peräisin funktionaalisista ohjelmointikielistä , mutta sitä tuetaan (tai määritellään) monissa proseduuri- , olio- ja moniparadigmakielissä , esimerkiksi: C++ -standardimallikirjastossa sitä kutsutaan , C#:ssa (3.0) se esitetään kirjoittaja . Toimintoa käytetään usein myös korkean tason kielissä, kuten Perl , Python ja Ruby ; kaikilla kolmella kielellä funktiota kutsutaan nimellä . Rubylla on myös alias . Common Lispissä on koko perhe karttamaisia toimintoja; , joka vastaa tässä kuvattua toimintaa (pääte tarkoittaa pääsyä CAR-toiminnon kautta ). On myös kieliä, joissa on syntaksirakenteita, jotka tarjoavat samanlaisia toimintoja kuin . transformSelectmapmapcollectmapcarcarmap
Joskus on olemassa yleinen versio map, joka ottaa funktion kahdesta argumentista, 2 listasta, ja soveltaa sitä vastaaviin luetteloiden elementteihin. Jotkut kielet antavat niille erityisiä nimiä, kuten map2tai zipWith. Funktio map, jossa on kaksi tai useampia luetteloita, aiheuttaa ongelman työskennellä eripituisten listojen kanssa. Eri kielet käyttäytyvät eri tavalla: jotkut jättävät poikkeuksen, toiset pysähtyvät, kun lyhyen listan loppu saavutetaan ja jättävät huomioimatta pidempien luetteloiden loput elementit, toiset taas siirtyvät pisimpään ja palauttavat jonkin erityisen arvon listoille, joiden arvot ovat jo päättyneet.
Ensiluokkaisia toimintoja tukevilla kielillä mapvoidaan käyttää curryingin kanssa tarjoamaan toiminto , joka suorittaa ennalta määritellyn muunnoksen luettelossa. Esimerkiksi map squareHaskellissa funktio, joka palauttaa listan, jonka jokainen elementti on yhtä suuri kuin argumenttiluettelon vastaava elementti neliöitynä.
Kieli | Kartta | Kartta 2 listaa | Kartta n listaa | Huomautuksia | Eripituisten luetteloiden käyttäytyminen |
---|---|---|---|---|---|
Haskell | karttatoimintoluettelo _ _ | zipWith Func list1 list2 | zipWith n funktiolla lista1 lista2 ... | n vastaa luetteloiden lukumäärää; määritetty zipWith7 :ään asti | pysähtyy lyhimmän luettelon päätyttyä |
Haxe | Lambda.map ( iteroitava , toimiva ) | ||||
J | toimintolista _ | lista toimintoluettelo _ | func / list1 , list2 , list3 , : list4 | Kielen taulukonkäsittelyominaisuuksien avulla voit kutsua implisiittisesti toimintoja, kuten karttaa | Listojen on oltava samanpituisia (pituusvirhe, jos luettelot eivät ole samanlaisia) |
OCaml | List.map func list Array.map func array |
List.map2 toiminto lista1 lista2 | heittää Invalid_argument -poikkeuksen | ||
Normaali ML | karttatoimintoluettelo _ _ | ListPair.map func ( lista1 , lista2 ) ListPair.mapEq funktio ( lista1 , lista2 ) |
Kahden listan kartalla func saa elementit monikkona . | ListPair.map pysähtyy, kun se saavuttaa lyhimmän luettelon lopun, ListPair.mapEq heittää UnequalLengths-poikkeuksen | |
Python | kartta ( func , list ) | kartta ( funktio , lista1 , lista2 ) | kartta ( funktio , lista1 , lista2 , …) | zip() ja map() (versio 3.x) pysähtyvät lyhimmän luettelon lopussa, map() (2.x) ja itertools.zip_longest() (3.x) laajentavat lyhyitä luetteloita None -arvoilla | |
rubiini | enum .collect { block } enum .map { block } |
enum1 .zip( enum2 ).map { block } | enum1 .zip( enum2 , …).map { block } [ enum1 , enum2 , …].transpose.map { block } |
enum on enum | pysähtyy, kun se saavuttaa sen luettelon lopun, jossa funktiota kutsutaan (ensimmäinen luettelo); jos jokin muu lista on lyhyempi, se laajenee nolla- arvoilla |
C++ | std::transform( alku , loppu , tulos , toiminto ) | std::transform( alku1 , loppu1 , alku2 , tulos , toiminto ) | otsikossa <algoritmi> alku , loppu , & tulos iteraattorit tulos kirjoitetaan tuloksen alkuun |
||
Perl | kartta lohkoluettelo kartta expr , lista _ |
Lohkossa tai lauseessa erikoisarvo $_ sisältää jokaisen luettelon arvon . | Ei käytössä | ||
C# 3.0 | enum .Select( func ) | ||||
C# 4.0 | enum .Select( func ) | ienum1 .Zip ( ienum2 , funktio ) | pysähtyy, kun lyhimmän luettelon loppu saavutetaan | ||
JavaScript 1.6 | array .map( func ) | - | - | kartta tarjotaan vain taulukkomenetelmänä, joten vain yhtä luetteloa (taulukkoa) voidaan käyttää | |
Yhteinen Lisp | ( mapcar toimintoluettelo ) | (mapcar func list1 list2 ) | (mapcar func list1 list2 ... ) | Pysähtyy, kun lyhimmän luettelon loppu saavutetaan | |
Kaava , Clojure | ( kartan toimintoluettelo ) | ( karttatoimintolista1 lista2 ) _ | ( karttafunktio lista1 lista2 ... ) | Pysähtyy, kun lyhimmän luettelon loppu saavutetaan | |
Rupattelu | aKokoelma kerätä: aBlock | aCollection1 with: aCollection2 kerää: aBlock | Putoaa | ||
Erlang | listat: kartta ( hauskaa , luettelo ) | listat: zipwith( Fun , List1 , List2 ) | zipwith3 on myös saatavilla | Luetteloiden on oltava yhtä pitkiä | |
PHP | array_map( takaisinsoitto , array ) | array_map( backback , array1 , array2 ) | array_map(backback , array1 , array2 , ...) | Takaisinsoittoargumenttien määrän on vastattava taulukoiden määrää. |
laajentaa lyhyitä luetteloita NULL- arvoilla |
Mathematica | func /@ lista Kartta[ func , list ] |
MapThread[ func , { list1 , list2 }] | MapThread[ func , { list1 , list2 , …}] | Luetteloiden on oltava yhtä pitkiä | |
MATLAB | arrayfun ( funktio , lista ) | arrayfun ( funktio , lista 1 , lista 2 ) | arrayfun ( funktio , lista 1 , ..., lista n ) | cellfun soluluetteloille | |
Maxima | kartta( f , lau 1 , …, lau n ) karttalista ( f , lau 1 , …, lau n ) |
||||
S / R | lapply ( lista , toiminto ) | maply( funktio , lista1 , lista2 ) | maply( funktio , lista1, lista2 , … ) | Lyhyet listat ovat syklisiä | |
Scala | lista .map( func ) | ( list1 , list2 ).zipped.map( func ) | ( lista1 , lista2 "lista3").zipped.map( func ) | enintään 3 listaa. | pysähtyy, kun se saavuttaa lyhimmän |
Java 8 | list.stream().map(func) | ei ensimmäisen luokan toimintoja; käyttöliittymä java.lang.Function<T, R> on käytössä |
Operaation matemaattinen perusta mapmahdollistaa monia optimointeja . (map f . map g) xs(jossa " " on funktion kokoonpanooperaattori. ) vastaa ; eli: . Tämä optimointi eliminoi kaksoiskutsun tarpeen yhdistämällä funktioiden ja [1] sovelluksen . map (f . g) xsmapfg
Toiminto mapvoidaan määrittää listataitolla . Erityisesti id xs = map id xs = foldr (:) [] xs = xs,. Yhdistelmä foldja mapvoidaan optimoida: foldr f z . map gvastaa foldr (f . g) z, eli map g xs = (id . map g) xs = foldr ((:) . g) [] xs. Tällainen toteutus map, kun sitä käytetään yksitellen linkitetyillä listoilla ei - laisilla kielillä, ei ole suoraan soveltuva tail-rekursion optimointiin (vaikka se on modulo cons ) optimoitavissa, joten se voi johtaa pinon ylivuotoon , jos sitä käytetään suuriin listoihin. . Monilla kielillä on vaihtoehtoinen "käänteinen karttatoiminto", joka vastaa karttatoimintoa lähetetyn luettelon tapauksessa, mutta jossa on mahdollisuus optimoida tail-rekursio. Toteutus vasemmalla taitolla:
revMap f xs = foldl ( \ ys x -> f x : ys ) [ ] xs