Liste medtagelse

Listeabstraktion eller listeforståelse i syntaksen  for nogle programmeringssprog er  en måde at kompakt beskrive listebehandlingsoperationer [ 1 ] .

Listeinkludering giver dig mulighed for at evaluere uendelige lister (på sprog, der understøtter dem). For eksempel på Miranda -sproget kan en uendelig liste med lige positive tal skrives som følger [1] :

[ n | n <- [ 1 .. ]; n rem 2 = 0 ]

som lyder: "listen over alle n sådan, at n er i [1..] og resten, når n er divideret med 2, er nul."

I analogi med listeoptagelser i andre programmeringssprog er der bitstrengsudtryk ( Erlang ), liste- og ordbogsoptagelser ( Python i version 3).

Terminologi

Oversættelsen af ​​Field og Harrisons bog "Functional Programming" [1] introducerer begrebet "listeabstraktion" og "listeinklusion". Litteraturen bruger dog også "listeudtryk", "listeudvalg" [2] , "listeindlejring" [3] [4] , "listegenerator" (måske ikke en særlig god oversættelse, da der i funktionel programmering findes en særskilt koncept for listegeneratoren, engelsk  listegenerator [5] ) [6] , "listedeterminant" [7] .

I aksiomatikken i Zermelo-Fraenkel-mængdeteorien er der et selektionsaksiom, som giver dig mulighed for at bygge et sæt baseret på det eksisterende, ved at vælge elementer, der svarer til et eller andet prædikat. Listeabstraktion er analog med udvælgelse til lister [8] og nogle gange støder man endda på udtrykket ZF-udtryk [9] .

Eksempler fra forskellige programmeringssprog

Python

Lige tal fra 2 til 9998 inklusive:

[ n for n i området ( 1 , 10000 ) hvis n % 2 == 0 ]

Listen inkluderer kan bruge indlejrede iterationer over variabler:

[( x , y ) for x i området ( 1 , 10 ) for y i området ( 1 , 10 ) hvis x % y == 0 ]

Python har også generatorudtryk, der har en syntaks svarende til listeforståelser, men som returnerer en iterator [10] . Summen af ​​de lige tal fra det foregående eksempel:

sum ( n for n i området ( 1 , 10000 ) hvis n % 2 == 0 )

I dette tilfælde er yderligere parenteser ikke nødvendige, men generelt vil deres fravær forårsage en syntaksfejl.

Som nævnt ovenfor giver Python lignende faciliteter til at oprette sæt og ordbøger.

>>> { x for x i området ( 10 )} { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } >>> { x : x ** 2 for x i området ( 10 )} { 0 : 0 , 1 : 1 , 2 : 4 , 3 : 9 , 4 : 16 , 5 : 25 , 6 : 36 , 7 : 49 , 8 : 64 , 9 : 81 }

Ruby

Lige tal fra 2 til 9998 inklusive:

( 1 ... 10000 ) . vælg { | jeg | i % 2 == 0 } # med en implicit to_proc-metode kalder :even symbolet? ( 1 ... 10000 ) . vælg ( & :even? )

Erlang

I Erlang ville listegeneratoren se sådan ud:

[ N || N <- [ 1 , 2 , 3 , 4 , 5 , 6 ], N rem2 == 0 ] .

Haskell

Eksempel med lige tal i Haskell [8] :

[ x | x <- [ 1 .. ], x ` mod ` 2 == 0 ] -- uendelig liste: [2,4,6,8,10..]

Hos Haskell x <- вырkaldes et udtryk af en art en generator . Der kan være flere generatorer i ét udvalg:

[( x , y ) | x <- [ 1 .. 4 ], y <- [ 1 .. 4 ], x ` mod ` y == 0 ] -- 8 unikke par: [(1,1),(2,1),(2 ,2),(3,1),(3,3),(4,1),(4,2),(4,4)]

LINQ i C#

LINQ for C# 3.0 har flere listelignende syntakser for forespørgselsudtryk [11] :

var s = Enumerable . Område ( 0 , 100 ). Hvor ( x => x * x > 3 ). Vælg ( x => x * 2 );

Alternativ syntaks, der minder om SQL :

var s = fra x i Enumerable . Område ( 0 , 100 ) hvor x * x > 3 vælg x * 2 ;

Julia

Listeforståelsessyntaksen i Julia er lånt fra Python.

Eksempel med en liste over lige tal:

[ n for n i 1 : 1000 hvis er lige ( n )]

Lignende syntaks bruges til at udfylde andre typer containere:

# Tuple tuple ( n ^ 2 for n in - 10 : 10 ) # sæt Indstil ( abs ( n ) for n i - 10 : 10 ) # Diktordbog ( c => kodepunkt ( c ) for c i 'a' : 'z' )

Som i Python understøttes indlejret iteration over flere variabler:

julia > [( x , y ) for x i 1 : 3 for y i 1 : 3 hvis x y ] 6 - element Array { Tuple { Int64 , Int64 }, 1 } : ( 1 , 2 ) ( 1 , 3 ) ( 2 , 1 ) ( 2 , 3 ) ( 3 , 1 ) ( 3 , 2 )

Noter

  1. 1 2 3 Field, Harrison, 1993 , s. 93-94.
  2. Alexey Beshenov. Funktionel programmering i Haskell: Del 4. List Folds, IBM . Dato for adgang: 14. december 2013. Arkiveret fra originalen 14. december 2013.
  3. Og igen om funktionel programmering i Python, Intersoft Lab-oversættelse . Dato for adgang: 14. december 2013. Arkiveret fra originalen 14. december 2013.
  4. David Mertz, Charming Python: Functional Programming in Python, del 1 . Dato for adgang: 14. december 2013. Arkiveret fra originalen 14. december 2013.
  5. Dushkin, 2007 , s. 110.
  6. Cesarini, Thompson, 2012 , s. 27.
  7. Dushkin, 2007 , s. 110-116.
  8. 1 2 Alexey Beshenov. Funktionel programmering i Haskell: Del 3. Defining Functions, IBM . Dato for adgang: 14. december 2013. Arkiveret fra originalen 14. december 2013.
  9. I. A. Dekhtyarenko, Deklarativ programmering, 5.8. Syntaktisk sukker: Erlang-sproget. 2003 (utilgængeligt link) . Hentet 14. december 2013. Arkiveret fra originalen 16. december 2013. 
  10. Prokhorenok, 2011 , s. 124.
  11. Albahari, Albahari, 2012 , s. 328-331.

Litteratur

  • Dushkin R. Funktionel programmering i Haskell - DMK-Press, 2007. - 608 s. — ISBN 5-94074-335-8 .
  • Prokhorenok N. A. Python. Det væsentlige.. - BHV-Petersburg, 2011. - 416 s. - ISBN 978-5-9775-0614-4 .
  • Field A., Harrison P. Funktionel programmering = Funktionel programmering. — M .: Mir, 1993. — 637 s. — ISBN 5-03-001870-0 .
  • Cesarini F. Thompson S. Programmering i Erlang = Erlang Programmering. - DMK Press, 2012. - 487 s. - ISBN 978-5-94074-617-1 .
  • Albahari, J. og Albahari, B. C# 5.0 i en nøddeskal: The Definitive Reference. - O'Reilly Media, Incorporated, 2012. - 1042 s. — ISBN 9781449320102 .