Lista de inclusión

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

Terminología

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

Ejemplos de varios lenguajes de programación

Pitón

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 }

Rubí

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

Erlang

En Erlang, el generador de listas se vería así:

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

Haskell

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

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 ;

Julio

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 )

Notas

  1. 1 2 3 Field, Harrison, 1993 , pág. 93-94.
  2. Aleksey Beshenov. Programación funcional en Haskell: Parte 4. Lista de pliegues, IBM . Fecha de acceso: 14 de diciembre de 2013. Archivado desde el original el 14 de diciembre de 2013.
  3. Y de nuevo sobre programación funcional en Python, traducción de Intersoft Lab . Fecha de acceso: 14 de diciembre de 2013. Archivado desde el original el 14 de diciembre de 2013.
  4. David Mertz, Charming Python: Programación funcional en Python, Parte 1 . Fecha de acceso: 14 de diciembre de 2013. Archivado desde el original el 14 de diciembre de 2013.
  5. Dushkin, 2007 , pág. 110.
  6. Cesarini, Thompson, 2012 , pág. 27
  7. Dushkin, 2007 , pág. 110-116.
  8. 1 2 Aleksey Beshenov. Programación funcional en Haskell: Parte 3. Definición de funciones, IBM . Fecha de acceso: 14 de diciembre de 2013. Archivado desde el original el 14 de diciembre de 2013.
  9. I. A. Dekhtyarenko, Programación declarativa, 5.8. Azúcar sintáctico: el lenguaje Erlang. 2003 (enlace no disponible) . Consultado el 14 de diciembre de 2013. Archivado desde el original el 16 de diciembre de 2013. 
  10. Prokhorenok, 2011 , pág. 124.
  11. Albahari, Albahari, 2012 , pág. 328-331.

Literatura

  • Dushkin R. Programación funcional en Haskell.- DMK-Press, 2007. - 608 p. — ISBN 5-94074-335-8 .
  • Prokhorenok N. A. Python. Lo esencial.. - BHV-Petersburg, 2011. - 416 p. - ISBN 978-5-9775-0614-4 .
  • Field A., Harrison P. Programación Funcional = Programación Funcional. — M .: Mir, 1993. — 637 p. — ISBN 5-03-001870-0 .
  • Cesarini F. Thompson S. Programación en Erlang = Programación Erlang. - Prensa DMK, 2012. - 487 p. - ISBN 978-5-94074-617-1 .
  • Albahari, J. y Albahari, B. C# 5.0 en pocas palabras: la referencia definitiva. - O'Reilly Media, Incorporated, 2012. - 1042 p. — ISBN 9781449320102 .