Kartta (ohjelmointi)

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 30. lokakuuta 2018 tarkistetusta versiosta . tarkastukset vaativat 7 muokkausta .

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

silloin 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ä.

Kielten vertailu

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

maperi kielillä

Kartta eri kielillä
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ä

Optimoinnit

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

Muistiinpanot

  1. "Karttafuusio: Haskellin tekeminen 225 % nopeammaksi" . Haettu 17. heinäkuuta 2011. Arkistoitu alkuperäisestä 6. elokuuta 2013.

Katso myös