Free Palestine and Lebanon 🍉 Stop the Genocide
Haskell Logo

Programação Funcional

Questão 8: zip

Voltar

Apresente uma definição recursiva da função (pré-definida) zip :: [a] -> [b] -> [(a,b)] que constrói uma lista de pares a partir de duas listas.

Exemplo

> zip [1,2,3] [10,20,30,40]
[(1,10),(2,20),(3,30)]

Resolução

Clica para revelar

zip :: [a] -> [b] -> [(a,b)]
zip [] _ = []
zip _ [] = []
zip (h:t) (h':t') = (h,h') : zip t t'

Explicação

Clica para revelar

Nesta função, temos de juntar duas listas numa lista de pares, de forma a que os 1ºs, 2ºs, 3ºs, etc. elementos de cada fiquem emparelhados. Se as listas tiverem comprimentos diferentes, a lista final fica com o comprimento da mais curta.

Como precisamos de percorrer as duas listas, iremos ter dois casos de paragem, um para cada lista.

zip [] _ = []
zip _ [] = []

Assim, a função termina quando qualquer uma das listas “termine”, isto é, fique vazia.

A definição recursiva da função é trivial, apenas precisamos de juntar as cabeças das listas, de modo a formar um par.

zip (h:t) (h':t') = (h,h') : zip t t'

Ficamos assim com a definição final desta função:

zip :: [a] -> [b] -> [(a,b)]
zip [] _ = []
zip _ [] = []
zip (h:t) (h':t') = (h,h') : zip t t'