La abstracción de listas o la comprensión de listas en la sintaxis de algunos lenguajes de programación es una forma de describir de forma compacta las operaciones de procesamiento de listas [1] .
La inclusión de listas le permite evaluar listas infinitas (en idiomas que las admitan). Por ejemplo, en el lenguaje Miranda , una lista infinita de números positivos pares se puede escribir de la siguiente manera [1] :
[ norte | n <- [ 1 .. ]; n rem 2 = 0 ]que dice: "la lista de todos los n tales que n está en [1..] y el resto cuando n se divide por 2 es cero".
Por analogía con las inclusiones de listas en otros lenguajes de programación, existen expresiones de cadenas de bits ( Erlang ), inclusiones de listas y diccionarios ( Python en la versión 3).
La traducción del libro de Field y Harrison "Programación funcional" [1] introduce el término "abstracción de lista" e "inclusión de lista". Sin embargo, la literatura también usa "expresión de lista", "selección de lista" [2] , "incrustación de lista" [3] [4] , "generador de lista" (quizás no sea una traducción muy buena, ya que en la programación funcional hay un concepto para el generador de listas, generador de listas en inglés [5] ) [6] , "determinante de listas" [7] .
En la axiomática de la teoría de conjuntos de Zermelo-Fraenkel, existe un axioma de selección, que permite construir un conjunto a partir del existente, eligiendo elementos que correspondan a algún predicado. La abstracción de listas es análoga a la selección de listas [8] y, a veces, incluso se encuentra con el término expresión ZF [9] .
Números pares del 2 al 9998 inclusive:
[ n para n en el rango ( 1 , 10000 ) si n % 2 == 0 ]La lista incluye puede usar iteraciones anidadas sobre variables:
[( x , y ) para x en el rango ( 1 , 10 ) para y en el rango ( 1 , 10 ) si x % y == 0 ]Python también tiene expresiones generadoras que tienen una sintaxis similar a las listas de comprensión pero devuelven un iterador [10] . La suma de los números pares del ejemplo anterior:
suma ( n para n en el rango ( 1 , 10000 ) si n % 2 == 0 )En este caso, no se necesitan paréntesis adicionales, pero en general su ausencia provocará un error de sintaxis.
Como se mencionó anteriormente, Python proporciona funciones similares para crear conjuntos y diccionarios.
>>> { x para x en rango ( 10 )} { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } >>> { x : x ** 2 para x en rango ( 10 )} { 0 : 0 , 1 : 1 , 2 : 4 , 3 : 9 , 4 : 16 , 5 : 25 , 6 : 36 , 7 : 49 , 8 : 64 , 9 : 81 }Números pares del 2 al 9998 inclusive:
( 1 ... 10000 ) . seleccionar { | yo | yo % 2 == 0 } # con una llamada implícita al método to_proc en el símbolo :even? ( 1 ... 10000 ) . seleccionar ( & :incluso? )En Erlang, el generador de listas se vería así:
[ norte || N <- [ 1 , 2 , 3 , 4 , 5 , 6 ], N rem 2 == 0 ].Ejemplo con números pares en Haskell [8] :
[ x | x <- [ 1 .. ], x ` mod ` 2 == 0 ] -- lista infinita: [2,4,6,8,10..]En Haskell, una expresión de un tipo x <- вырse llama generador . Puede haber varios generadores en una selección:
[( x , y ) | x <- [ 1 .. 4 ], y <- [ 1 .. 4 ], x ` mod ` y == 0 ] -- 8 pares únicos: [(1,1),(2,1),(2 ,2),(3,1),(3,3),(4,1),(4,2),(4,4)]LINQ para C# 3.0 tiene varias sintaxis similares a listas para expresiones de consulta [11] :
var s = Enumerable . Rango ( 0 , 100 ). Donde ( x => x * x > 3 ). Seleccione ( x => x * 2 );Sintaxis alternativa, que recuerda a SQL :
var s = de x en Enumerable . Rango ( 0 , 100 ) donde x * x > 3 seleccione x * 2 ;La sintaxis de comprensión de listas en Julia se toma prestada de Python.
Ejemplo con una lista de números pares:
[ n para n en 1 : 1000 si es siete ( n )]Se utiliza una sintaxis similar para llenar otros tipos de contenedores:
# Tupla tupla ( n ^ 2 para n en - 10 : 10 ) # conjunto Conjunto ( abs ( n ) para n en - 10 : 10 ) # Diccionario de dictados ( c => punto de código ( c ) para c en 'a' : 'z' )Al igual que en Python, se admite la iteración anidada sobre múltiples variables:
julia > [( x , y ) para x en 1 : 3 para y en 1 : 3 si x ≠ y ] Array de 6 elementos { Tupla { Int64 , Int64 }, 1 } : ( 1 , 2 ) ( 1 , 3 ) ( 2 , 1 ) ( 2 , 3 ) ( 3 , 1 ) ( 3 , 2 )