Luettelon sisällyttäminen

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

Terminologia

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

Esimerkkejä eri ohjelmointikielistä

Python

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 }

Ruby

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

Erlang

Erlangissa luettelogeneraattori näyttäisi tältä:

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

Haskell

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

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 ;

Julia

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 )

Muistiinpanot

  1. 1 2 3 Field, Harrison, 1993 , s. 93-94.
  2. Aleksei Bešenov. Funktionaalinen ohjelmointi Haskellissa: Osa 4. List Folds, IBM . Käyttöpäivä: 14. joulukuuta 2013. Arkistoitu alkuperäisestä 14. joulukuuta 2013.
  3. Ja taas toiminnallisesta ohjelmoinnista Pythonissa, Intersoft Lab -käännöksestä . Käyttöpäivä: 14. joulukuuta 2013. Arkistoitu alkuperäisestä 14. joulukuuta 2013.
  4. David Mertz, Charming Python: Functional Programming in Python, Osa 1 . Käyttöpäivä: 14. joulukuuta 2013. Arkistoitu alkuperäisestä 14. joulukuuta 2013.
  5. Dushkin, 2007 , s. 110.
  6. Cesarini, Thompson, 2012 , s. 27.
  7. Dushkin, 2007 , s. 110-116.
  8. 1 2 Aleksei Bešenov. Functional Programming in Haskell: Osa 3. Defining Functions, IBM . Käyttöpäivä: 14. joulukuuta 2013. Arkistoitu alkuperäisestä 14. joulukuuta 2013.
  9. I. A. Dekhtjarenko, Deklaratiivinen ohjelmointi, 5.8. Syntaktinen sokeri: Erlang-kieli. 2003 (linkki ei saatavilla) . Haettu 14. joulukuuta 2013. Arkistoitu alkuperäisestä 16. joulukuuta 2013. 
  10. Prokhorenok, 2011 , s. 124.
  11. Albahari, Albahari, 2012 , s. 328-331.

Kirjallisuus

  • Dushkin R. Funktionaalinen ohjelmointi Haskellissa - DMK-Press, 2007. - 608 s. — ISBN 5-94074-335-8 .
  • Prokhorenok N. A. Python. Olennainen.. - BHV-Petersburg, 2011. - 416 s. - ISBN 978-5-9775-0614-4 .
  • Kenttä A., Harrison P. Funktionaalinen ohjelmointi = Functional Programming. — M .: Mir, 1993. — 637 s. — ISBN 5-03-001870-0 .
  • Cesarini F. Thompson S. Ohjelmointi Erlangilla = Erlang Programming. - DMK Press, 2012. - 487 s. - ISBN 978-5-94074-617-1 .
  • Albahari, J. ja Albahari, B. C# 5.0 pähkinänkuoressa: The Definitive Reference. - O'Reilly Media, Incorporated, 2012. - 1042 s. — ISBN 9781449320102 .