Na programação de computadores , a sintaxe de certas linguagens de programação permite definir listas de compreensão , ou seja, listas cujo conteúdo é definido filtrando o conteúdo de outra lista de acordo com um princípio semelhante ao da definição na compreensão da teoria dos conjuntos . Esta construção sintática se distingue da construção mais comum em linguagens de programação que é definir listas pela enumeração de seus elementos.
Esta construção sintática oferece vantagens de legibilidade e concisão e é semelhante à notação usada em matemática:
Na linguagem de programação Haskell , a sintaxe é a seguinte:
S = [x | x <- [0 ..], x ^ 2> 3]A lista [0..]representa a lista de números naturais e x^2>3representa a propriedade característica da lista.
Pode-se ler o seguinte:
" S é a lista de todos os x , onde x é um elemento da lista de números naturais e x tem o seu maior praça de 3."
A primeira linguagem de programação a oferecer definições por compreensão é SETL . A primeira referência à definição aplicada pela compreensão das listas deve-se a Rod Burstall e John Darlington na descrição de sua linguagem de programação NPL (in) em 1977.
No sistema de álgebra computacional AXIOM , uma construção semelhante gerencia o fluxo (ou fluxos) que podem ser pensadas como listas intermináveis.
Os entendimentos foram propostos como uma notação de consulta de banco de dados e foram implementados na linguagem de consulta de banco de dados Kleisli.
Na linguagem de programação Haskell , os entendimentos de lista são expressões que podem conter funções de ordem superior mape filter.
Por exemplo :
s = filter (\x -> x^2 > 3) [0..] -- ou s = [x | x <- [0..], x^2 > 3]Nesse idioma, a sintaxe de compreensão de lista usa uma série de qualificadores após a barra vertical . Um qualificador tem duas partes: |
A linguagem de programação Python também fornece uma sintaxe para expressar a compreensão da lista, portanto, o exemplo anterior é expresso quase igualmente:
# À 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]Visto que uma lista é uma mônada particular, é natural generalizar o entendimento para qualquer mônada, o que Haskell faz.
Uma extensão do Compilador Glasgow Haskell é a compreensão de lista paralela (também chamada de compreensão zip ).
Ele permite vários ramos independentes de qualificadores.
Onde os qualificadores separados por vírgulas são dependentes, os ramos separados por barras “| São avaliados em paralelo.
Vamos primeiro considerar a compreensão de lista com qualificadores dependentes convencionais:
A lista resultante conterá pares, compostos de elementos das listas a e b . Para cada elemento de a , um elemento de b é usado por sua vez para obter todas as combinações possíveis de a e b ( produto cartesiano ).
Agora, considere a compreensão da lista com diferentes qualificadores fornecidos pela extensão:
[(x, y) | x <- a | y <- b]A diferença é que a lista resultante não conterá todas as combinações. Em vez disso, a primeira ramificação produz um item de a e a segunda ramificação de b . O resultado é, então, uma série de pares cada uma composta por uma metade de um e meio b , como se as duas listas um e b tinham sido justapostos.
Considerando uma reescrita de funções de ordem superior, a compreensão paralela adiciona zipwith ao mapa e filtro anteriores. O exemplo de compreensão paralela poderia ser simplesmente reescrito da seguinte forma:
zipWith (,) abNo caso geral, cada ramificação paralela pode ser reescrita em uma compreensão de lista separada. O resultado é compactado em uma lista alinhada e outros entendimentos de lista o transformam na lista de resultados.
Haskell:
Pitão:
Lisp Comum
Axioma: