Gelen bilgisayar programlama , sözdizimi belli programlama dillerinin mümkün tanımlamak için yapar anlama listeleri , yani listeleri , içeriği ile tanımlanır filtreleme o benzer bir prensip uyarınca başka bir listenin içeriğini anlama tanımına küme teorisinin. Bu sözdizimsel yapı, öğelerini numaralandırarak listeleri tanımlayan programlama dillerindeki en yaygın yapıdan ayırt edilir.
Bu sözdizimsel yapı, okunabilirlik ve kısalık avantajları sunar ve matematikte kullanılan gösterime benzer:
Haskell programlama dilinde sözdizimi aşağıdaki gibidir:
S = [x | x <- [0 ..], x ^ 2> 3][0..]Liste, doğal sayılar listesini temsil eder ve listenin x^2>3karakteristik özelliğini temsil eder.
: Aşağıdaki gibi okunabilir
" S tüm listesi x x doğal sayı listesi bir elementtir ve X 3'ten onun kare büyüktür vardır"
Anlayarak tanımlar sunan ilk programlama dili SETL'dir . Tanımına birinci referans listelerini kavrayarak uygulanan programlama dili tanımlayan Rod Burstall ve John Darlington kaynaklanmaktadır TGA (in) 1977 yılında
ise bir bilgisayar cebir sistemi aksiyomu , benzer bir inşaat yöneten akışını (ya da akışları) kutu sonsuz listeler olarak düşünülebilir.
Anlayışlar bir veritabanı sorgu notasyonu olarak önerildi ve Kleisli veritabanı sorgu dilinde uygulandı.
Haskell programlama dilinde liste anlayışları, daha yüksek dereceli işlevleri mapve filter.
Örneğin :
s = filter (\x -> x^2 > 3) [0..] -- ou s = [x | x <- [0..], x^2 > 3]Bu dilde, liste anlama sözdizimi, dikey çubuktan sonra |bir dizi niteleyici kullanır . Bir niteleyicinin iki bölümü vardır:
Python programlama dili ayrıca listenin anlaşılmasını ifade etmek için bir sözdizimi sağlar, bu nedenle önceki örnek neredeyse eşit olarak ifade edilir:
# À cause de l'évaluation stricte (c'est-à-dire non paresseuse), # les listes en Python doivent être finies, # par exemple ici la liste de 0 à 99: L = range(100) s = [x for x in L if x**2 > 3]Bir liste bir olduğu için özellikle monad , Haskell yapar herhangi monad, hiç anlayış genelleme doğaldır.
Bir uzantısı Glasgow Haskell derleyici olan paralel liste anlama (aynı zamanda fermuar anlama ).
Birkaç bağımsız niteleyici dalına izin verir.
Virgülle ayrılan niteleyiciler bağımlı olduğunda, çubuklarla ayrılan dallar “| Paralel olarak değerlendirilir.
Önce geleneksel bağımlı niteleyicilerle liste kavrayışını ele alalım:
Ortaya çıkan liste, a ve b listelerindeki öğelerden oluşan çiftleri içerecektir . a'nın her elemanı için , a ve b'nin tüm olası kombinasyonlarını elde etmek için b'nin bir elemanı kullanılır ( Kartezyen çarpım ).
Şimdi, uzantı tarafından sağlanan farklı niteleyicilere sahip listenin anlaşılmasını düşünün:
[(x, y) | x <- bir | y <- b]Aradaki fark, ortaya çıkan listenin tüm kombinasyonları içermemesidir. Bunun yerine, ilk dal a öğesinden bir öğe , ikinci dal ise b öğesinden bir öğe üretir . Elde edilen sonuç çiftlerinin bir dizi yarım oluşan her biri a buçuk b iki liste gibi, bir ve b yan yana edilmiştir.
Daha yüksek dereceli işlevlerin yeniden yazılması düşünüldüğünde, paralel anlama , önceki haritaya ve filtreye zipwith ekler . Paralel anlama örneği basitçe şu şekilde yeniden yazılabilir:
zipWith (,) abGenel durumda, her paralel dal ayrı bir liste kavrayışına yeniden yazılabilir. Sonuç, hizalanmış bir listeye sıkıştırılır ve diğer liste anlayışları onu sonuç listesine dönüştürür.
Haskell:
Python:
Ortak Lisp
aksiyom: