Abstracția listelor sau înțelegerea listelor în sintaxa unor limbaje de programare este o modalitate de a descrie în mod compact operațiunile de procesare a listelor [1] .
Includerea listelor vă permite să evaluați liste infinite (în limbile care le acceptă). De exemplu, în limbajul Miranda , o listă infinită de numere pare pozitive poate fi scrisă după cum urmează [1] :
[ n | n <- [ 1 .. ]; n rem 2 = 0 ]care spune: „lista tuturor n astfel încât n este în [1..] iar restul când n este împărțit la 2 este zero”.
Prin analogie cu incluziunile de liste din alte limbaje de programare, există expresii șir de biți ( Erlang ), incluziuni de listă și dicționar ( Python în versiunea 3).
Traducerea cărții lui Field și Harrison „Programarea funcțională” [1] introduce termenul „abstracție a listelor” și „incluziune a listelor”. Cu toate acestea, literatura de specialitate folosește și „expresie de listă”, „selectare listă” [2] , „încorporare listă” [3] [4] , „generator de liste” (poate că nu este o traducere foarte bună, deoarece în programarea funcțională există o serie separată). concept pentru generatorul de liste, generator de liste în limba engleză [5] ) [6] , „determinant de listă” [7] .
În axiomatica teoriei mulțimilor Zermelo-Fraenkel, există o axiomă de selecție, care vă permite să construiți o mulțime pe baza celei existente, prin alegerea elementelor care corespund unui predicat. Abstracția listelor este analogă cu selecția pentru liste [8] și uneori chiar întâlniți termenul ZF-expression [9] .
Numere pare de la 2 la 9998 inclusiv:
[ n pentru n în intervalul ( 1 , 10000 ) dacă n % 2 == 0 ]Lista include pot folosi iterații imbricate peste variabile:
[( x , y ) pentru x în interval ( 1 , 10 ) pentru y în interval ( 1 , 10 ) dacă x % y == 0 ]Python are, de asemenea, expresii generatoare care au o sintaxă similară listelor de înțelegere, dar returnează un iterator [10] . Suma numerelor pare din exemplul anterior:
suma ( n pentru n în intervalul ( 1 , 10000 ) dacă n % 2 == 0 )În acest caz, nu sunt necesare paranteze suplimentare, dar în general absența lor va provoca o eroare de sintaxă.
După cum am menționat mai sus, Python oferă facilități similare pentru crearea de seturi și dicționare.
>>> { x pentru x în interval ( 10 )} { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } >>> { x : x ** 2 pentru x în interval ( 10 ) )} { 0 : 0 , 1 : 1 , 2 : 4 , 3 : 9 , 4 : 16 , 5 : 25 , 6 : 36 , 7 : 49 , 8 : 64 , 9 : 81 }Numere pare de la 2 la 9998 inclusiv:
( 1 ... 10000 ) . selectați { | eu | i % 2 == 0 } # cu un apel implicit al metodei to_proc pe simbolul :even? ( 1 ... 10000 ) . selectează ( & :chiar? )În Erlang, generatorul de liste ar arăta astfel:
[ N || N <- [ 1 , 2 , 3 , 4 , 5 , 6 ], N rem 2 == 0 ].Exemplu cu numere pare în Haskell [8] :
[ x | x <- [ 1 .. ], x ` mod ` 2 == 0 ] -- listă infinită: [2,4,6,8,10..]În Haskell, o expresie de un fel x <- вырeste numită generator . Pot exista mai multe generatoare într-o singură selecție:
[( x , y ) | x <- [ 1 .. 4 ], y <- [ 1 .. 4 ], x ` mod ` y == 0 ] -- 8 perechi unice: [(1,1),(2,1),(2 ,2),(3,1),(3,3),(4,1),(4,2),(4,4)]LINQ pentru C# 3.0 are mai multe sintaxe de tip listă pentru expresiile de interogare [11] :
var s = Enumerabil . Interval ( 0 , 100 ). Unde ( x => x * x > 3 ). Selectați ( x => x * 2 );Sintaxă alternativă, care amintește de SQL :
var s = din x în Enumerable . Interval ( 0 , 100 ) unde x * x > 3 selectează x * 2 ;Sintaxa de înțelegere a listei din Julia este împrumutată din Python.
Exemplu cu o listă de numere pare:
[ n pentru n în 1 : 1000 dacă este par ( n )]Sintaxă similară este utilizată pentru a popula alte tipuri de containere:
# Tuplu tuplu ( n ^ 2 pentru n în - 10 : 10 ) # set Set ( abs ( n ) pentru n in - 10:10 ) _ # Dicționar Dict ( c => punct de cod ( c ) pentru c în 'a' : 'z' )Ca și în Python, este acceptată iterația imbricată peste mai multe variabile:
julia > [( x , y ) pentru x în 1 : 3 pentru y în 1 : 3 dacă x ≠ y ] 6 - element Array { Tuple { Int64 , Int64 }, 1 } : ( 1 , 2 ) ( 1 , 3 ) ( 2 , 1 ) ( 2 , 3 ) ( 3 , 1 ) ( 3 , 2 )