Lista felvétel

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

Terminológia

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éldák különböző programozási nyelvekből

Python

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 : 81

Ruby

Pá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

Erlang nyelven a listagenerátor így néz ki:

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

Haskell

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

LINQ C#-ban

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 ;

Julia

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 )

Jegyzetek

  1. 1 2 3 Field, Harrison, 1993 , p. 93-94.
  2. Alekszej Besenov. Funkcionális programozás a Haskellben: 4. rész. List Folds, IBM . Hozzáférés időpontja: 2013. december 14. Az eredetiből archiválva : 2013. december 14.
  3. És ismét a funkcionális programozásról Pythonban, az Intersoft Lab fordításáról . Hozzáférés időpontja: 2013. december 14. Az eredetiből archiválva : 2013. december 14.
  4. David Mertz, Charming Python: Functional Programming in Python, 1. rész . Hozzáférés időpontja: 2013. december 14. Az eredetiből archiválva : 2013. december 14.
  5. Dushkin, 2007 , p. 110.
  6. Cesarini, Thompson, 2012 , p. 27.
  7. Dushkin, 2007 , p. 110-116.
  8. 1 2 Alekszej Besenov. Funkcionális programozás Haskellben: 3. rész. Funkciók meghatározása, IBM . Hozzáférés időpontja: 2013. december 14. Az eredetiből archiválva : 2013. december 14.
  9. I. A. Dehtyarenko, Deklaratív programozás, 5.8. Szintaktikus cukor: az Erlang nyelv. 2003 (nem elérhető link) . Letöltve: 2013. december 14. Az eredetiből archiválva : 2013. december 16.. 
  10. Prokhorenok, 2011 , p. 124.
  11. Albahari, Albahari, 2012 , p. 328-331.

Irodalom

  • Dushkin R. Funkcionális programozás Haskellben - DMK-Press, 2007. - 608 p. — ISBN 5-94074-335-8 .
  • Prokhorenok N. A. Python. A lényeg.. - BHV-Petersburg, 2011. - 416 p. - ISBN 978-5-9775-0614-4 .
  • Field A., Harrison P. Funkcionális programozás = Funkcionális programozás. — M .: Mir, 1993. — 637 p. — ISBN 5-03-001870-0 .
  • Cesarini F. Thompson S. Programozás Erlang nyelven = Erlang Programozás. - DMK Press, 2012. - 487 p. - ISBN 978-5-94074-617-1 .
  • Albahari, J. és Albahari, B. C# 5.0 dióhéjban: The Definitive Reference. - O'Reilly Media, Incorporated, 2012. - 1042 p. — ISBN 9781449320102 .