Listan abstraktio tai listan ymmärtäminen joidenkin ohjelmointikielten syntaksissa on tapa kuvata tiiviisti listankäsittelytoimintoja [ 1 ] .
Listojen sisällyttämisen avulla voit arvioida äärettömiä listoja (niitä tukevilla kielillä). Esimerkiksi Mirandan kielellä ääretön lista parillisista positiivisista luvuista voidaan kirjoittaa seuraavasti [1] :
[ n | n <- [ 1 .. ]; n rem 2 = 0 ]jossa lukee: "luettelo kaikista n:stä siten, että n on kohdassa [1..] ja jäännös, kun n jaetaan kahdella, on nolla."
Analogisesti muiden ohjelmointikielten luetteloinkluusioiden kanssa on olemassa bittimerkkijonolausekkeita ( Erlang ), lista- ja sanakirjainkluusioita ( Python versiossa 3).
Fieldin ja Harrisonin kirjan "Functional Programming" [1] käännös ottaa käyttöön termit "listan abstraktio" ja "luettelon sisällyttäminen". Kirjallisuudessa käytetään kuitenkin myös "listalauseketta", "luettelovalintaa" [2] , "listan upottamista" [3] [4] , "listageneraattoria" (ei ehkä kovin hyvä käännös, koska toiminnallisessa ohjelmoinnissa on erillinen konsepti listageneraattorille, englanninkielinen listageneraattori [5] ) [6] , "list determinant" [7] .
Zermelo-Fraenkelin joukkoteorian aksiomatiikassa on valinnan aksiooma, jonka avulla voidaan rakentaa joukko olemassa olevan perusteella valitsemalla elementtejä, jotka vastaavat jotakin predikaattia. Listan abstraktio on analoginen listojen valinnan kanssa [8] ja joskus törmäät jopa termiin ZF-lauseke [9] .
Parilliset luvut 2-9998 mukaan lukien:
[ n n : lle alueella ( 1 , 10000 ) , jos n % 2 == 0 ]Lista sisältää voivat käyttää sisäkkäisiä iteraatioita muuttujien yli:
[ ( x , y ) x : lle alueella ( 1 , 10 ) ylle alueella ( 1 , 10 ) jos x % y == 0 ] _Pythonissa on myös generaattorilausekkeita, joiden syntaksi on samanlainen kuin luettelon ymmärtämisessä, mutta palauttaa iteraattorin [10] . Edellisen esimerkin parillisten lukujen summa:
summa ( n n arvolle alueella ( 1 , 10 000 ) jos n % 2 == 0 )Tässä tapauksessa ylimääräisiä sulkeita ei tarvita, mutta yleensä niiden puuttuminen aiheuttaa syntaksivirheen.
Kuten edellä mainittiin, Python tarjoaa samanlaiset mahdollisuudet sarjojen ja sanakirjojen luomiseen.
>>> { x x : lle alueella ( 10 )} { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } >>> { x : x ** 2 x :lle alueella ( 10 ) )} { 0 : 0 , 1 : 1 , 2 : 4 , 3 : 9 , 4 : 16 , 5 : 25 , 6 : 36 , 7 : 49 , 8 : 64 , 9 : 81 }Parilliset luvut 2-9998 mukaan lukien:
( 1 ... 10 000 ) . valitse { | minä | i % 2 == 0 } # implisiittisellä to_proc-menetelmän kutsulla :even-symbolilla? ( 1 ... 10 000 ) . valitse ( & :parillinen? )Erlangissa luettelogeneraattori näyttäisi tältä:
[ N || N <- [ 1 , 2 , 3 , 4 , 5 , 6 ], N rem2 == 0 ] .Esimerkki parillisista luvuista Haskellissa [8] :
[ x | x <- [ 1 .. ], x ` mod ` 2 == 0 ] -- ääretön lista: [2,4,6,8,10..]Haskellissa eräänlaista ilmaisua x <- вырkutsutaan generaattoriksi . Yhdessä valinnassa voi olla useita generaattoreita:
[( x , y ) | x <- [ 1 .. 4 ], y <- [ 1 .. 4 ], x ` mod ` y == 0 ] -- 8 yksilöllistä paria: [(1,1),(2,1),(2 ,2),(3,1),(3,3),(4,1),(4,2),(4,4)]LINQ for C# 3.0 sisältää useita luettelomaisia syntakseja kyselylausekkeille [11] :
var s = Luettelo . Alue ( 0 , 100 ). Missä ( x => x * x > 3 ). Valitse ( x => x * 2 );Vaihtoehtoinen syntaksi, joka muistuttaa SQL :ää:
var s = alkaen x luettelossa . _ Alue ( 0 , 100 ) , jossa x * x > 3 valitse x * 2 ;Julian luettelon ymmärtämisen syntaksi on lainattu Pythonista.
Esimerkki parillisten lukujen luettelosta:
[ n n : lle 1 : 1000 , jos itseparillinen ( n )]Samanlaista syntaksia käytetään muun tyyppisten säilöjen täyttämiseen:
# Tuple monikko ( n ^ 2 n in - 10 : 10 ) # set Set ( abs ( n ) n in - 10 : 10 ) # Sanakirja ( c => koodipiste ( c ) c :lle ' a' : 'z' )Kuten Pythonissa, useiden muuttujien sisäkkäistä iteraatiota tuetaan:
julia > [( x , y ) x :lle 1 : 3 : lle y :lle 1 : 3 :lle, jos x ≠ y ] 6 - elementtinen taulukko { Tuple { Int64 , Int64 }, 1 } : ( 1 , 2 ) ( 1 , 3 ) ( 2 , 1 ) ( 2 , 3 ) ( 3 , 1 ) ( 3 , 2 )