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).
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] .
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 }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? )I Erlang ville listegeneratoren se sådan ud:
[ N || N <- [ 1 , 2 , 3 , 4 , 5 , 6 ], N rem2 == 0 ] .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 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 ;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 )