Kort (programmering)

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 30. oktober 2018; checks kræver 7 redigeringer .

map er en højere-ordens funktion, der bruges i mange programmeringssprog, der anvender en eller anden funktion til hvert element i listen over dets argumenter, hvilket producerer en liste over resultater som returværdi. Når det ses i funktionel form, omtales det ofte som "anvend-på-alle" .

For eksempel, hvis du definerer en funktion squaresom denne:

kvadrat x = x * x

map square [1,2,3,4,5]så returnerer opkaldet en liste [1,4,9,16,25], da det vil mapanvende funktionen squarepå hvert element og samle resultaterne i samme rækkefølge.

Sammenligning af sprog

En funktion mapstammer fra funktionelle programmeringssprog , men er understøttet (eller defineret) i mange procedure- , objektorienterede og multiparadigmesprog , for eksempel: i C++ Standard Template Library kaldes den , i C# (3.0) er den repræsenteret af . Funktionen bruges også ofte i sprog på højt niveau som Perl , Python og Ruby ; på alle tre sprog hedder funktionen . Ruby har også et alias for . Almindelig Lisp har en hel familie af kortlignende funktioner; , svarende til den her beskrevne adfærd (suffikset betyder adgang via CAR-operationen ). Der er også sprog med syntakskonstruktioner, der giver funktionalitet svarende til . transformSelectmapmapcollectmapcarcarmap

Nogle gange er der en generisk version map, der tager en funktion af to argumenter, 2 lister, og anvender den på de tilsvarende elementer i listerne. Nogle sprog giver dem specielle navne som map2eller zipWith. En funktion mapmed to eller flere lister giver anledning til problemet med at arbejde med lister af forskellig længde. Forskellige sprog opfører sig forskelligt: ​​nogle afgiver en undtagelse, andre stopper, når slutningen af ​​en kort liste er nået og ignorerer resten af ​​elementerne på længere lister, atter andre går til den længste og returnerer en speciel værdi for lister, hvis værdier ​allerede er afsluttet.

På sprog, der understøtter førsteklasses funktioner , mapkan bruges med currying for at give en funktion, der udfører en foruddefineret transformation på en liste. For eksempel map squarei Haskell, en funktion, der returnerer en liste, hvis hvert element er lig med det tilsvarende element i argumentlisten, i kvadrat.

mappå forskellige sprog

Kort på forskellige sprog
Sprog Kort Kort 2 lister Kort n lister Noter Adfærd for Lister af forskellige Længder
Haskell kort funktionsliste _ zipMed func liste1 liste2 zipWith n func liste1 liste2 ... n svarer til antallet af lister; defineret op til zipWith7 stopper efter slutningen af ​​den korteste liste
Haxe Lambda.map( iterable , func )
J funktionsliste _ liste funktionsliste _ func / list1 , list2 , list3 , : list4 Sprogets matrixhåndteringsfunktioner giver dig mulighed for implicit at kalde funktioner såsom kort Lister skal have samme længde
(længdefejl, hvis lister ikke er ens)
OKaml List.map func liste
Array.map func array
Liste.kort2 funktionsliste1 liste2 _ kaster en Invalid_argument undtagelse
Standard ML kort funktionsliste _ ListPair.map func ( liste1 , liste2 )
ListPair.mapEq func ( liste1 , liste2 )
For et kort med to lister får func elementerne som en tupel . ListPair.map stopper, når den når slutningen af ​​den korteste liste, ListPair.mapEq kaster en UnequalLengths-undtagelse
Python kort ( func , liste ) map( func , liste1 , liste2 ) kort ( func , liste1 , liste2 , …) zip() og map() (version 3.x) stopper i slutningen af ​​den korteste liste, map() (2.x) og itertools.zip_longest() (3.x) udvider korte lister med None -værdier
rubin enum .collect { blok }
enum .map { blok }
enum1 .zip( enum2 ).map { blok } enum1 .zip( enum2 , …).map { blok }
[ enum1 , enum2 , …].transpose.map { blok }
enum  er en enum stopper, når den når slutningen af ​​den liste, hvorpå funktionen kaldes (den første liste); hvis en anden liste er kortere, udvides den med nul- værdier
C++ std::transform( start , end , result , func ) std::transform( start1 , end1 , begin2 , result , func ) i headeren <algoritme>
start , end , & resultat iteratorer
vil resultatet blive skrevet til begyndelsen af ​​resultatet
Perl kortblokliste kortudtr , liste
_ _ _
I blok eller udtr , indeholder den specielle værdi $_ hver værdi på listen. N/A
C# 3.0 enum .Select( func )
C# 4.0 enum .Select( func ) ienum1 .Zip( ienum2 , func ) stopper, når slutningen af ​​den korteste liste nås
JavaScript 1.6 array .map( func ) - - map leveres kun som en matrixmetode, så kun én liste (array) kan anvendes
Almindelig Lisp ( mapcar funktionsliste ) (mapcar func liste1 liste2 ) (mapcar func liste1 liste2 ... ) Stopper, når slutningen af ​​den korteste liste nås
Scheme , Clojure ( kortfunktionsliste ) _ ( kortfunktionsliste1 liste2 ) _ ( kortfunktionsliste1 liste2 ... ) Stopper, når slutningen af ​​den korteste liste nås
Småsnak aCollection collect: aBlock aCollection1 med: aCollection2 collect: aBlok Falder ned
Erlang lister: kort( Sjov , Liste ) lister: zipwith( Sjov , Liste1 , Liste2 ) zipwith3 er også tilgængelig Listerne skal have samme længde
PHP array_map( tilbagekald , array ) array_map( tilbagekald , array1 , array2 ) array_map( tilbagekald , array1 , array2 , ...) Antallet af tilbagekaldsargumenter skal svare til antallet af arrays .
udvide korte lister med NULL- værdier
Mathematica func /@ liste
Kort[ func , liste ]
MapThread[ func , { liste1 , liste2 }] MapThread[ func , { liste1 , liste2 , …}] Listerne skal have samme længde
MATLAB arrayfun ( func, liste ) arrayfun ( func, liste 1 , liste 2 ) arrayfun ( func, liste 1 , ..., liste n ) cellfun til cellelister
Maxima map( f , expr 1 , …, expr n )
maplist( f , expr 1 , …, expr n )
S / R lapply ( liste , func ) maply( func , liste1 , liste2 ) mapply( func , liste1 , liste2 ,...) Korte lister er cykliske
Scala liste .map( func ) ( liste1 , liste2 ).zipped.map( func ) ( liste1 , liste2 , "liste3").zipped.map( func ) ikke mere end 3 lister. stopper, når den når slutningen af ​​den korteste
Java 8 list.stream().map(func) ingen førsteklasses funktioner; interface java.lang.Function<T, R> bruges

Optimeringer

Det matematiske grundlag for operationen mapgiver mulighed for mange optimeringer . (map f . map g) xs(hvor " " .er funktionssammensætningsoperatoren ) svarer til map (f . g) xs ; det vil sige :. Denne optimering eliminerer behovet for et dobbeltkald ved at kombinere anvendelsen af ​​funktioner og [1] . mapfg

Funktionen mapkan defineres ved hjælp af listefoldning . Især id xs = map id xs = foldr (:) [] xs = xs. Kombinationen af fold​​og mapkan optimeres: foldr f z . map gsvarende til foldr (f . g) z, således map g xs = (id . map g) xs = foldr ((:) . g) [] xs. En sådan implementering maper, når den bruges med enkeltlinkede lister i ikke - dovne sprog, ikke direkte modtagelig for hale-rekursionsoptimering (selvom den er modulo cons ) optimerbar, så den kan føre til et stackoverløb, hvis det anvendes på store lister . På mange sprog findes der en alternativ "omvendt kortfunktion", som svarer til kortfunktionen i tilfælde af en opslået liste, men med mulighed for at optimere halerekursion. Implementering ved hjælp af venstre fold:

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

Noter

  1. "Kortfusion: Gør Haskell 225 % hurtigere" . Hentet 17. juli 2011. Arkiveret fra originalen 6. august 2013.

Se også