Maratona de Haskell - Quarto Dia

Fala pessoal!

Hoje vamos falar um pouco mais sobre listas, mas nós vamos dar uma olhada também em tuplas.


List Comprehension

Nos dias dois e três nós vimos como criar e usar listas, hoje vamos continuar falando de outra forma de usar listas chamado list comprehension. List comprehensions são o caminho para transformar, combinar e filtrar listas. Isso é similar ao conceito de set comprehension na matemática, mas nós não prestaremos atenção nisso. Vamos iniciar dizendo que queremos gerar uma lista com os valores de 1 até 10 todos multiplicados por 2. Com list comprehension nós podemos fazer desta forma:

[ x*2 | x <- [1..10]]
[2,4,6,8,10,12,14,16,18,20]

Muito fácil. Vamos fazer isso um pouco mais complexo e dizer que somente queremos os valores maior que 10:

[ x*2 | x <- [1..10], x*2 > 10]
[12,14,16,18,20]

Outra coisa que podemos fazer com list comprehension além de transformar e filtrar é combinação. Vamos combinar três listas:

[x+y+z | x <- [1,2,3], y <- [101,102,103], z <- [1001,1002,1003]]
[1103,1104,1105,1104,1105,1106,1105,1106,1107,1104,1105,1106,1105,1106,1107,1106,1107,1108,1105,1106,1107,1106,1107,1108,1107,1108,1109]

Agora vamos tentar o list comprehension com uma lista de listas e somente pegar os números ímpares:

let a = [1,2,3,4,5]
let b = [7,8,9,2,3,4,5]
let c = [11,12,13,14,15,16,17,18]
[ [ x | x <- xs, odd x ] | xs <- [a,b,c] ]
[[1,3,5],[7,9,3,5],[11,13,15,17]]

O list comprehension é realmente uma poderosa feature do Haskell, e nós ainda trabalharemos com isso hoje.


Tuplas

Tuplas são usados em Haskell para armazenar tipos heterogênios. Existem algumas similariedades entre listas e tuplas, mas além de tuplas serem heterogêneas elas tem tamanho fixo também.

(1,2)
(1,2)
(1,2,hello)
(1,2,hello)
(1,2,hello, True)
(1,2,hello, True)

Tuplas tem tamanho fixo então nós só devemos usa-las quando sabemos quantos elementos vamos necessitar. Quando tuplas tem dois elementos nós podesmos usar as funções fst e snd.

fst (2,5)
2
snd (2,5)
5

Nós podemos usar o list comprehension que vimos antes combinado com tuplas e obter todas a combinações de listas. Vamos tentar:

[(x,y,z) | x <- [1,2,3], y <- [101,102,103], z <- [1001,1002,1003]]
[(1,101,1001),(1,101,1002),(1,101,1003),(1,102,1001),(1,102,1002),(1,102,1003),(1,103,1001),(1,103,1002),(1,103,1003),(2,101,1001),(2,101,1002),(2,101,1003),(2,102,1001),(2,102,1002),(2,102,1003),(2,103,1001),(2,103,1002),(2,103,1003),(3,101,1001),(3,101,1002),(3,101,1003),(3,102,1001),(3,102,1002),(3,102,1003),(3,103,1001),(3,103,1002),(3,103,1003)]

Aqui cada tupla é uma combinação.


Amanhã nós iremos iniciar a mergulhar nos tipos de Haskell.

Written on December 4, 2016