A lista absztrakciója vagy a lista megértése egyes programozási nyelvek szintaxisában a listafeldolgozási műveletek tömör leírásának módja [1] .
A listák felvétele lehetővé teszi a végtelen listák értékelését (az azokat támogató nyelveken). Például a Miranda nyelvben a páros pozitív számok végtelen listája a következőképpen írható [1] :
[ n | n <- [ 1 .. ]; n rem 2 = 0 ]amely így szól: "az összes n listája úgy, hogy n az [1..]-ben van, a maradék pedig, ha n-t osztunk 2-vel, nulla."
Más programozási nyelvek listás befoglalásaival analóg módon léteznek bitkarakterlánc-kifejezések ( Erlang ), lista- és szótárbefoglalások ( Python a 3-as verzióban).
Field és Harrison "Functional Programming" [1] című könyvének fordítása bevezeti a "lista absztrakció" és a "listabefoglalás" kifejezéseket. A szakirodalom azonban használja a "lista kifejezést", "lista kijelölést" [2] , "lista beágyazást" [3] [4] , "lista generátort" is (talán nem túl jó fordítás, hiszen a funkcionális programozásban külön létezik koncepció a listagenerátorhoz, angol listagenerátor [5] ) [6] , "listadetermináns" [7] .
A Zermelo-Fraenkel halmazelmélet axiomatikájában létezik egy szelekciós axióma, amely lehetővé teszi, hogy a meglévő halmaz alapján halmazt építsünk, valamilyen predikátumnak megfelelő elemek kiválasztásával. A lista absztrakciója hasonló a listák kiválasztásához [8] , és néha még a ZF-kifejezés [9] kifejezéssel is találkozhatunk .
Páros számok 2-től 9998-ig:
[ n n esetén az ( 1 , 10000 ) tartományban , ha n % 2 == 0 ]A listák tartalmazhatnak beágyazott iterációkat a változók felett:
[( x , y ) ha x az ( 1 , 10 ) tartományban van , ha y az ( 1 , 10 ) tartományban , ha x % y == 0 ]A Pythonnak vannak generátorkifejezései is, amelyek szintaxisa hasonló a listamegértésekhez, de egy iterátort adnak vissza [10] . Az előző példában szereplő páros számok összege:
összeg ( n n esetén az ( 1 , 10000 ) tartományban , ha n % 2 == 0 )Ebben az esetben nincs szükség további zárójelekre, de általában ezek hiánya szintaktikai hibát okoz.
Mint fentebb említettük, a Python hasonló lehetőségeket biztosít készletek és szótárak létrehozásához.
>>> { x tartományban ( 10 ) } { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } >>> { x : x ** 2 x tartományban ( 10 ) _ _ _ ) } { 0 : 0 , 1 : 1 , 2 : 4 , 3 : 9 , 4 : 16 , 5 : 25 , 6 : 36 , 7 : 49 , 8 : 64 , 9 : 81Páros számok 2-től 9998-ig:
( 1 ... 10000 ) . válassza a { | én | i % 2 == 0 } # implicit to_proc metódushívással az :even szimbólumon? ( 1 ... 10000 ) . válassz ( & :páros? )Erlang nyelven a listagenerátor így néz ki:
[ N || N <- [ 1 , 2 , 3 , 4 , 5 , 6 ], N rem 2 == 0 ].Példa páros számokkal a Haskellben [8] :
[ x | x <- [ 1 .. ], x ` mod ` 2 == 0 ] -- végtelen lista: [2,4,6,8,10..]A Haskellben egyfajta kifejezést generátornakx <- выр neveznek . Egy választásban több generátor is lehet:
[( x , y ) | x <- [ 1 .. 4 ], y <- [ 1 .. 4 ], x ` mod ` y == 0 ] -- 8 egyedi pár: [(1,1),(2,1),(2 ,2),(3,1),(3,3),(4,1),(4,2),(4,4)]A LINQ for C# 3.0 számos listaszerű szintaxissal rendelkezik a lekérdezési kifejezésekhez [11] :
var s = Felsorolható . Tartomány ( 0 , 100 ). Ahol ( x => x * x > 3 ). Válassza ki az ( x => x * 2 );Alternatív, SQL -re emlékeztető szintaxis :
var s = from x in Enumerable . Tartomány ( 0 , 100 ) , ahol x * x > 3 válassza ki az x * 2 -t ;A Julia nyelvű lista megértési szintaxisa a Pythonból származik.
Példa páros számok listájával:
[ n n az 1 -ben : 1000 ha iseven ( n )]Hasonló szintaxist használnak más típusú tárolók feltöltésére is:
# Tuple sor ( n ^ 2 n in - 10 : 10 esetén ) # set Set ( abs ( n ) for n in - 10 : 10 ) # Dict szótár ( c => kódpont ( c ) c - hez 'a' : 'z' )A Pythonhoz hasonlóan a beágyazott iteráció több változón is támogatott:
julia > [ ( x , y ) for x 1 : 3 for y in 1 : 3 if x ≠ y ] 6 elemű Array { Tuple { Int64 , Int64 } , 1 } : ( 1 , 2 ) ( 1 , 3 ) ( 2 , 1 ) ( 2 , 3 ) ( 3 , 1 ) ( 3 , 2 )