Abstrakce seznamu nebo porozumění seznamu v syntaxi některých programovacích jazyků je způsob, jak kompaktně popsat operace zpracování seznamu [1] .
Zahrnutí seznamu vám umožňuje vyhodnocovat nekonečné seznamy (v jazycích, které je podporují). Například v jazyce Miranda lze nekonečný seznam sudých kladných čísel zapsat takto [1] :
[ n | n <- [ 1 .. ]; n rem 2 = 0 ]který zní: "seznam všech n takových, že n je v [1..] a zbytek, když je n děleno 2, je nula."
Analogicky se seznamovými inkluzemi v jiných programovacích jazycích existují výrazy bitových řetězců ( Erlang ), seznamové a slovníkové inkluze ( Python ve verzi 3).
Překlad Field and Harrisonovy knihy „Functional Programming“ [1] zavádí termín „abstrakce seznamu“ a „začlenění seznamu“. V literatuře se ale také používá „výraz seznamu“, „výběr seznamu“ [2] , „vkládání seznamu“ [3] [4] , „generátor seznamu“ (možná nepříliš dobrý překlad, jelikož ve funkcionálním programování existují samostatné koncept pro generátor seznamu, anglický generátor seznamu [5] ) [6] , "determinant seznamu" [7] .
V axiomatice Zermelo-Fraenkelovy teorie množin existuje axiom selekce, který umožňuje sestavit množinu na základě existující, výběrem prvků, které odpovídají nějakému predikátu. Seznamová abstrakce je obdobou výběru pro seznamy [8] a někdy se setkáte i s pojmem ZF-výraz [9] .
Sudá čísla od 2 do 9998 včetně:
[ n pro n v rozsahu ( 1 , 10000 ) , pokud n % 2 == 0 ]Seznam zahrnuje může používat vnořené iterace nad proměnnými:
[( x , y ) pro x v rozsahu ( 1 , 10 ) pro y v rozsahu ( 1 , 10 ) pokud x % y == 0 ]Python má také generátorové výrazy, které mají syntaxi podobnou výkladům seznamu, ale vracejí iterátor [10] . Součet sudých čísel z předchozího příkladu:
součet ( n pro n v rozsahu ( 1 , 10000 ) , pokud n % 2 == 0 )V tomto případě nejsou další závorky potřeba, ale obecně jejich absence způsobí chybu syntaxe.
Jak bylo uvedeno výše, Python poskytuje podobné možnosti pro vytváření sad a slovníků.
>>> { x pro x v rozsahu ( 10 )} { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } >>> { x : x ** 2 pro x v rozsahu ( 10 )} { 0 : 0 , 1 : 1 , 2 : 4 , 3 : 9 , 4 : 16 , 5 : 25 , 6 : 36 , 7 : 49 , 8 : 64 , 9 : 81 }Sudá čísla od 2 do 9998 včetně:
( 1 ... 10 000 ) . vyberte { | já | i % 2 == 0 } # s implicitním voláním metody to_proc na symbolu :even? ( 1 ... 10 000 ) . vybrat ( & :sudé? )V Erlangu by generátor seznamu vypadal takto:
[ N || N <- [ 1 , 2 , 3 , 4 , 5 , 6 ], N rem2 == 0 ] .Příklad se sudými čísly v Haskell [8] :
[ x | x <- [ 1 .. ], x ` mod ` 2 == 0 ] -- nekonečný seznam: [2,4,6,8,10..]V Haskellu se výraz svého druhu x <- вырnazývá generátor . V jednom výběru může být několik generátorů:
[( x , y ) | x <- [ 1 .. 4 ], y <- [ 1 .. 4 ], x ` mod ` y == 0 ] -- 8 jedinečných párů: [(1,1),(2,1),(2 ,2),(3,1),(3,3),(4,1),(4,2),(4,4)]LINQ pro C# 3.0 má několik syntaxí podobných seznamům pro výrazy dotazu [11] :
var s = Enumerable . Rozsah ( 0 , 100 ). Kde ( x => x * x > 3 ). Vyberte ( x => x * 2 );Alternativní syntaxe, připomínající SQL :
var s = z x v Enumerable . Rozsah ( 0 , 100 ) kde x * x > 3 vyberte x * 2 ;Syntaxe pro porozumění seznamu v Julii je vypůjčena z Pythonu.
Příklad se seznamem sudých čísel:
[ n pro n v 1 : 1000 , pokud je rovno ( n )]Podobná syntaxe se používá k naplnění dalších typů kontejnerů:
# Tuple tuple ( n ^ 2 pro n in - 10 : 10 ) # set Set ( abs ( n ) pro n in - 10 : 10 ) # Dict slovník ( c => codepoint ( c ) pro c v 'a' : 'z' )Stejně jako v Pythonu je podporována vnořená iterace přes více proměnných:
julia > [ ( x , y ) pro x v 1 : 3 pro y v 1 : 3 if x ≠ y ] 6prvkové pole { Tuple { Int64 , Int64 } , 1 } : ( 1 , 2 ) ( 1 , 3 ) ( 2 , 1 ) ( 2 , 3 ) ( 3 , 1 ) ( 3 , 2 )