Zařazení do seznamu

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

Terminologie

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

Příklady z různých programovacích jazyků

Python

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 }

Ruby

Sudá čísla od 2 do 9998 včetně:

( 1 ... 10 000 ) . vyberte { | | i % 2 == 0 } # s implicitním voláním metody to_proc na symbolu :even? ( 1 ... 10 000 ) . vybrat ( & :sudé? )

Erlang

V Erlangu by generátor seznamu vypadal takto:

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

Haskell

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 v C#

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 ;

Julia

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 )

Poznámky

  1. 1 2 3 Field, Harrison, 1993 , str. 93-94.
  2. Alexej Bešenov. Funkční programování v Haskellu: Část 4. List Folds, IBM . Datum přístupu: 14. prosince 2013. Archivováno z originálu 14. prosince 2013.
  3. A opět o funkcionálním programování v Pythonu, překlad Intersoft Lab . Datum přístupu: 14. prosince 2013. Archivováno z originálu 14. prosince 2013.
  4. David Mertz, Okouzlující Python: Funkční programování v Pythonu, 1. část . Datum přístupu: 14. prosince 2013. Archivováno z originálu 14. prosince 2013.
  5. Dushkin, 2007 , str. 110.
  6. Cesarini, Thompson, 2012 , str. 27.
  7. Dushkin, 2007 , str. 110-116.
  8. 1 2 Alexej Bešenov. Funkční programování v Haskellu: Část 3. Definování funkcí, IBM . Datum přístupu: 14. prosince 2013. Archivováno z originálu 14. prosince 2013.
  9. I. A. Dekhtyarenko, Deklarativní programování, 5.8. Syntaktický cukr: jazyk Erlang. 2003 (nedostupný odkaz) . Získáno 14. prosince 2013. Archivováno z originálu 16. prosince 2013. 
  10. Prochorenok, 2011 , str. 124.
  11. Albahari, Albahari, 2012 , str. 328-331.

Literatura

  • Dushkin R. Funkční programování v Haskellu - DMK-Press, 2007. - 608 s. — ISBN 5-94074-335-8 .
  • Prochorenok N. A. Python. To podstatné.. - BHV-Petersburg, 2011. - 416 s. - ISBN 978-5-9775-0614-4 .
  • Field A., Harrison P. Funkční programování = Funkční programování. — M .: Mir, 1993. — 637 s. — ISBN 5-03-001870-0 .
  • Cesarini F. Thompson S. Programování v Erlangu = Erlang Programování. - DMK Press, 2012. - 487 s. - ISBN 978-5-94074-617-1 .
  • Albahari, J. a Albahari, B. C# 5.0 v kostce: Definitivní reference. - O'Reilly Media, Incorporated, 2012. - 1042 s. — ISBN 9781449320102 .