Includerea în listă

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).

Terminologie

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] .

Exemple din diferite limbaje de programare

Python

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 }

Ruby

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? )

Erlang

În Erlang, generatorul de liste ar arăta astfel:

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

Haskell

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 în C#

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 ;

Julia

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 )

Note

  1. 1 2 3 Field, Harrison, 1993 , p. 93-94.
  2. Alexey Beshenov. Programarea funcțională în Haskell: Partea 4. List Folds, IBM . Data accesului: 14 decembrie 2013. Arhivat din original pe 14 decembrie 2013.
  3. Și din nou despre programarea funcțională în Python, traducere Intersoft Lab . Data accesului: 14 decembrie 2013. Arhivat din original pe 14 decembrie 2013.
  4. David Mertz, Charming Python: Functional Programming in Python, Part 1 . Data accesului: 14 decembrie 2013. Arhivat din original pe 14 decembrie 2013.
  5. Dușkin, 2007 , p. 110.
  6. Cesarini, Thompson, 2012 , p. 27.
  7. Dușkin, 2007 , p. 110-116.
  8. 1 2 Alexey Beshenov. Programarea funcțională în Haskell: Partea 3. Definirea funcțiilor, IBM . Data accesului: 14 decembrie 2013. Arhivat din original pe 14 decembrie 2013.
  9. I. A. Dekhtyarenko, Programare declarativă, 5.8. Zahar sintactic: limba Erlang. 2003 (link indisponibil) . Consultat la 14 decembrie 2013. Arhivat din original pe 16 decembrie 2013. 
  10. Prokhorenok, 2011 , p. 124.
  11. Albahari, Albahari, 2012 , p. 328-331.

Literatură

  • Dushkin R. Programare funcțională în Haskell - DMK-Press, 2007. - 608 p. — ISBN 5-94074-335-8 .
  • Prokhorenok N. A. Python. Esențiale.. - BHV-Petersburg, 2011. - 416 p. - ISBN 978-5-9775-0614-4 .
  • Câmpul A., Harrison P. Programare funcțională = Programare funcțională. — M .: Mir, 1993. — 637 p. — ISBN 5-03-001870-0 .
  • Cesarini F. Thompson S. Programming in Erlang = Erlang Programming. - DMK Press, 2012. - 487 p. - ISBN 978-5-94074-617-1 .
  • Albahari, J. și Albahari, B. C# 5.0 pe scurt: Referința definitivă. - O'Reilly Media, Incorporated, 2012. - 1042 p. — ISBN 9781449320102 .