Questão 2: Escreva uma função recursiva remove em Haskell que receba uma lista p de números inteiros e um número inteiro a, e retorne uma nova lista q construída a partir de p removendo a primeira ocorrência de a em p, conforme o exemplo:
> remove [1, 5, 3, 4] 3
[1, 5, 4]
> remove [3, 1, 3] 3
[1, 3]
> remove [7, -1, 0, 10] 2
[7, -1, 0, 10]
> remove [] 6
[]

Passo 1

A questão pede para criar em Haskell uma função recursiva remove que receba uma lista de inteiros p e um inteiro a, e retorne uma nova lista q removendo a primeira ocorrência de a em p. O conteúdo aqui é recursão em listas e pattern matching em Haskell.

Passo 2

Em Haskell vamos usar pattern matching para distinguir dois casos: lista vazia e lista não vazia (x:xs). Esse mecanismo nos permite tratar separadamente o caso base e o caso recursivo.

Passo 3

Caso base: quando a lista é vazia (p == []), não há elemento a para remover, então o resultado é simplesmente a lista vazia.
Caso recursivo: quando temos (x:xs), comparamos x e a. Se x == a, removemos exatamente essa primeira ocorrência retornando xs e não chamamos mais recursão (interrompemos ali). Se x /= a, mantemos x no resultado e chamamos recursivamente remove em xs. Assim garantimos que apenas a primeira ocorrência seja retirada e o restante da lista seja preservado.

Resposta

remove :: [Int] -> Int -> [Int]
remove [] _ = []
remove (x:xs) a
| x == a = xs
| otherwise = x : remove xs a

Exercícios relacionados