Compreendendo List Comprehensions

List Comprehension é a implementação de um formalismo para criação de conjuntos através de listas, sendo estes conjuntos obtidos através e geradores ou filtros.

Este formalismo é proveniente do axioma da separação (também conhecido com o axioma da compreensão), proposto no conjunto de axiomas de Zermelo-Fraenkel, o qual é o mais utilizado atualmente para fundamentar a teoria de conjuntos, dado que os antigos axiomas propostos por Cantor e Frege foram considerados contraditórios com a descoberta do paradoxo de Russell.

O axioma da separação nos diz que se temos um conjunto e aplicamos uma operação a elementos desse conjunto, existirá um outro conjunto que contém os elementos provenientes dessa operação.  Isso o enquadra como um esquema para axiomas (gera uma infinidade de outros axiomas, a depender da definição do operador).

Em termos de linguagem de programação, é uma maneira de classificar certos elementos de uma Lista através de um filtro e a resultante do filtro é uma nova lista, resultante de uma operação de filtragem (subconjunto da lista original) ou de geradores (lista com informações cruzadas).

Falando um pouco de programação, Erlang possui uma notação clara para list comprehensions. O código abaixo:

[X || X <- [0,1,2,3,4,5,6,7,8,9], X rem 2 == 0].

> [0,2,4,6,8]

Nos diz que para uma lista X, extraia os números pares desta lista. Um número variado de restrições pode ser colocado:

[X || X <- [0,1,2,3,4,5,6,7,8,9], X rem 2 == 0, X > 0, X < 5].

>[2,4]

Ou ainda, escrever funções de extração de dados semelhante à algebra relacional:

select(Nome, Pessoas) -> [Altura || {Nomes, Altura} <- Pessoas, Nomes == Nome].

>select(proteu, [{joao,1.65}, {maria,1.80}, {proteu,1.80}, {proteu,1.82}])

>[1.80000,1.82000]

O exemplo acima seleciona o valor da estatura das tuplas para pessoas chamadas proteu. De forma análoga, podemos fazer para as pessoas de mesma estatura:

select(Altura, Pessoas) -> [Nome || {Nome, Alturas} <- Pessoas, Alturas == Altura].

select(1.80, [{joao,1.65}, {maria,1.80}, {proteu,1.80}, {proteu,1.82}])

>[maria,proteu]

Além de poder operar com união de listas, produtos cartesianos, etc. A aplicação do axioma de separação está ligado diretamente ao modo como bases de dados relacionais operam com cruzamento de informação. Não é a toa que o verbete sobre Frege no wikipedia comenta que um acadêmico o coloca como o pai dos bancos de dados relacionais.

Comments