Questão 6: Escreva uma função em Haskell, sem o uso direto de recursão, que receba uma lista de números positivos e retorne o maior número presente na lista. Você não pode utilizar a função maximum. Sugestão: trabalhe com a ideia de função de acumulação.

Passo 1

O enunciado pede para definir em Haskell uma função que receba uma lista de números positivos e retorne o maior elemento, sem usar recursão direta nem a função maximum. Vamos usar um padrão de acumulação (fold) para resolver isso.

Passo 2

Em Haskell, as funções de acumulação foldr, foldl e suas variantes foldr1 e foldl1 permitem processar listas sem recursão explícita. A ideia é manter um acumulador que guarda o “melhor até agora” enquanto caminha pela lista. Quando usamos foldl1 ou foldr1 não precisamos fornecer um valor inicial, pois o primeiro (ou último) elemento da lista já funciona como ponto de partida.
Como queremos o maior elemento, definimos um passo de acumulação que compara o acumulador com o elemento atual da lista e retorna aquele que for maior. Em Haskell podemos escrever essa comparação com uma função anônima:
lambda acc , x to if x > acc then x else acc
Aplicamos essa função com foldl1 sobre a lista para obter o maior valor. Finalmente, basta dar um nome à nossa função e atribuir a definição com foldl1 e o lambda. Não usamos recursão explícita nem a função maximum, apenas a função de acumulação.

Passo 3

Exemplo de uso:
• maximo [3,1,4,2] resulta em 4
• maximo [10] resulta em 10

Resposta

maximo :: (Ord a) => [a] -> a
maximo = foldl1 (\acc x -> if x > acc then x else acc)

Exercícios relacionados