Karta (programmering)

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 30 oktober 2018; kontroller kräver 7 redigeringar .

map är en högre ordningsfunktion som används i många programmeringsspråk som tillämpar någon funktion på varje element i listan över dess argument, och producerar en lista med resultat som returvärde. När det ses i funktionell form kallas det ofta för "tillämpa-på-alla" .

Till exempel, om du definierar en funktion squareså här:

kvadrat x = x * x

då kommer anropet map square [1,2,3,4,5]att returnera en lista [1,4,9,16,25]eftersom det kommer att maptillämpa funktionen squarepå varje element och samla resultaten i samma ordning.

Jämförelse av språk

En funktion maphärstammar från funktionella programmeringsspråk , men stöds (eller definieras) i många procedur- , objektorienterade och multiparadigmspråk , till exempel: i C++ Standard Template Library kallas den , i C# (3.0) representeras den. av . Funktionen används också ofta i högnivåspråk som Perl , Python och Ruby ; på alla tre språken heter funktionen . Ruby har också ett alias för . Common Lisp har en hel familj av kartliknande funktioner; , motsvarande beteendet som beskrivs här (suffixet betyder åtkomst via CAR-operationen ). Det finns också språk med syntaxkonstruktioner som ger funktionalitet som liknar . transformSelectmapmapcollectmapcarcarmap

Ibland finns det en generisk version mapsom tar en funktion av två argument, 2 listor, och tillämpar den på motsvarande element i listorna. Vissa språk ger dem speciella namn som map2eller zipWith. En funktion mapmed två eller flera listor ger upphov till problemet att arbeta med listor av olika längd. Olika språk beter sig olika: vissa gör ett undantag, andra slutar när slutet av en kort lista nås och ignorerar resten av elementen i längre listor, andra går till den längsta och returnerar något speciellt värde för listor vars värden ​har redan tagit slut.

På språk som stöder förstklassiga funktioner , mapkan användas med currying för att tillhandahålla en funktion som utför en fördefinierad transformation på en lista. Till exempel, map squarei Haskell, en funktion som returnerar en lista, vars varje element är lika med motsvarande element i argumentlistan, i kvadrat.

mappå olika språk

Karta på olika språk
Språk Karta Karta 2 listor Karta n listor Anteckningar Beteende för listor med olika längder
Haskell kartfunktionslista _ _ zipMed func list1 list2 zipWith n func list1 list2 ... n motsvarar antalet listor; definieras upp till zipWith7 stoppar efter slutet av den kortaste listan
Haxe Lambda.map ( iterable , func )
J funktionslista _ lista funk lista func / list1 , list2 , list3 , : list4 Språkets arrayhanteringsfunktioner låter dig implicit anropa funktioner som karta Listor måste vara lika långa
(längdfel om listor inte är lika)
Ocaml List.map func list
Array.map func array
List.map2 func list1 list2 kastar ett Invalid_argument-undantag
Standard ML kartfunktionslista _ _ ListPair.map func ( list1 , list2 )
ListPair.mapEq func ( list1 , list2 )
För en karta över två listor får func elementen som en tupel . ListPair.map stannar när den når slutet av den kortaste listan, ListPair.mapEq kastar ett UnequalLengths-undantag
Pytonorm karta ( func , lista ) map( func , list1 , list2 ) map( func , list1 , list2 , …) zip() och map() (version 3.x) stannar i slutet av den kortaste listan, map() (2.x) och itertools.zip_longest() (3.x) expanderar korta listor med None- värden
rubin enum .collect { block }
enum .map { block }
enum1 .zip( enum2 ).map { block } enum1 .zip( enum2 , …).map { block }
[ enum1 , enum2 , …].transpose.map { block }
enum  är en enum slutar när den når slutet av listan där funktionen anropas (den första listan); om någon annan lista är kortare utökas den med nollvärden
C++ std::transform( start , end , result , func ) std::transform( start1 , end1 , begin2 , result , func ) i rubriken <algorithm>
start , end , & resultat iteratorer
kommer resultatet att skrivas till början av resultatet
Perl map block list
map expr , list
I block eller expr innehåller specialvärdet $_ varje värde i listan. N/A
C# 3.0 enum .Select( func )
C# 4.0 enum .Select( func ) ienum1 .Zip( ienum2 , func ) stoppar när slutet av den kortaste listan nås
JavaScript 1.6 array .map( func ) - - map tillhandahålls endast som en arraymetod, så endast en lista (array) kan tillämpas
Vanlig Lisp (mapcar func lista ) (mapcar func list1 list2 ) (mapcar func list1 list2 ... ) Stoppar när slutet av den kortaste listan nås
Scheme , Clojure ( kartfunktionslista ) _ (map func list1 list2 ) (karta func list1 list2 ...) Stoppar när slutet av den kortaste listan nås
Småprat aCollection collect: aBlock aCollection1 med: aCollection2 collect: aBlock Ramlar ner
Erlang listor: map( Fun , List ) lists: zipwith( Fun , List1 , List2 ) zipwith3 är också tillgänglig Listor måste vara lika långa
PHP array_map( callback , array ) array_map( callback , array1 , array2 ) array_map( callback , array1 , array2 , ...) Antalet callback- argument
måste matcha antalet arrayer.
expandera korta listor med NULL- värden
Mathematica func /@ list
Karta[ func , list ]
MapThread[ func , { list1 , list2 }] MapThread[ func , { list1 , list2 , …}] Listor måste vara lika långa
MATLAB arrayfun ( func, lista ) arrayfun ( func, lista 1 , lista 2 ) arrayfun ( func, lista 1 , ..., lista n ) cellfun för celllistor
Maxima map( f , expr 1 , …, expr n )
maplist( f , expr 1 , …, expr n )
S / R lapply( lista , func ) mapply( func , list1 , list2 ) mapply( func , list1 , list2 ,...) Korta listor är cykliska
Scala list .map( func ) ( list1 , list2 ).zipped.map( func ) ( list1 , list2 , "list3").zipped.map( func ) inte mer än 3 listor. stannar när den når slutet av den kortaste
Java 8 list.stream().map(func) inga förstklassiga funktioner; gränssnitt java.lang.Function<T, R> används

Optimering

Den matematiska grunden för operationen mapmöjliggör många optimeringar . (map f . map g) xs(där " " är funktionssammansättningsoperatorn. ) är ekvivalent med  ; det vill säga: . Denna optimering eliminerar behovet av ett dubbelsamtal genom att kombinera tillämpningen av funktioner och [1] . map (f . g) xsmapfg

Funktionen mapkan definieras med listfoldning . I synnerhet, id xs = map id xs = foldr (:) [] xs = xs. Kombinationen av foldoch mapkan optimeras: foldr f z . map gmotsvarar foldr (f . g) z, alltså map g xs = (id . map g) xs = foldr ((:) . g) [] xs. En sådan implementering map, när den används med enkellänkade listor i icke - lata språk, är inte direkt mottaglig för optimering av svansrekursion (även om den är modulo cons ) optimerbar, så den kan leda till ett stackspill om det tillämpas på stora listor . På många språk finns en alternativ "omvänd kartfunktion", som är likvärdig med kartfunktionen vid en postad lista, men med möjlighet att optimera svansrekursionen. Implementering med vänstervikning:

revMap f xs = foldl ( \ ys x -> f x : ys ) [] xs

Anteckningar

  1. "Kartafusion: Gör Haskell 225 % snabbare" . Hämtad 17 juli 2011. Arkiverad från originalet 6 augusti 2013.

Se även