Free Palestine and Lebanon 🍉 Stop the Genocide
Haskell Logo

Programação Funcional

Questão 7: drop

Voltar

Apresente uma definição recursiva da função (pré-definida) drop :: Int -> [a] -> [a] que dado um inteiro n e uma lista l calcula a lista sem os (no máximo) n primeiros elementos de l.

Exemplo

> drop 2 [10,20,30]
[30]

Resolução

Clica para revelar

drop :: Int -> [a] -> [a]
drop _ [] = []
drop n (h:t)
    | n <= 0 = h : t
    | otherwise = drop (n - 1) t

Explicação

Clica para revelar

A função a definir aqui será fundamentalmente igual à função da questão anterior, com uma diferença: em vez de “pegar” em elementos, queremos “deitá-los fora”.

A partir da definição de take:

take :: Int -> [a] -> [a]
take _ [] = []
take n (h:t)
    | n <= 0 = []
    | otherwise = h : take (n - 1) t

Apenas temos de fazer umas pequenas alterações:

drop :: Int -> [a] -> [a]
drop _ [] = []
drop n (h:t)
    | n <= 0 = h : t
    | otherwise = drop (n - 1) t

O que é que mudámos? Primeiro, quando n <= 0, em vez de devolver uma lista vazia, devemos devolver a própria lista. Segundo, na definição recursiva, em vez de introduzir os elementos que percorremos numa lista, fazemos o oposto, isto é, ignoramo-los.