Questão 7: Como generalizar a função do exercício anterior para que receba um lista com números positivos e negativos, e, ainda, assim, a mesma seja capaz de retornar o maior número presente na lista sem fazer uso direto de recursão.

Passo 1

O enunciado pede para estender a função do exercício anterior de modo que ela aceite listas contendo números positivos e negativos e retorne o maior elemento sem usar recursão explícita. O conteúdo envolvido é o de funções de ordem superior em Haskell (folds) que permitem abstrair a recursão sobre listas.

Passo 2

No exercício anterior talvez tivéssemos algo como uma definição recursiva com caso base fixo em 0, o que falha quando todos os elementos são negativos. Para resolver isso sem recursão direta, precisamos usar uma função de ordem superior que percorra a lista e acumule o maior valor encontrado, sem depender de um valor neutro que distorça o resultado.

Passo 3

Em Haskell podemos usar a função foldl1, que aplica um operador binário sobre pares de elementos da lista começando pelos dois primeiros, depois combinando o resultado com o terceiro, e assim por diante. Como operador usamos a função max, que escolhe o maior de dois valores. O resultado é justamente o maior elemento da lista.

Passo 4

Definimos então:
maxList :: (Ord a) => [a] -> a
maxList = foldl1 max
Aqui não usamos recursão explícita: a recursão está encapsulada em foldl1. O tipo (Ord a) => [a] -> a garante que funciona para qualquer tipo ordenável, inclusive inteiros com valores negativos.

Passo 5

Exemplo de uso:
> maxList [3, -5, 9, 0, -2]
9

Resposta

Em Haskell, basta usar
maxList :: (Ord a) => [a] -> a
maxList = foldl1 max

Exercícios relacionados