Questão 2: Escreva uma função em Haskell, sem o uso direto de recursão, que receba um número e retorne uma lista com todos os divisores desse número.

Passo 1

O enunciado pede uma função em Haskell que, dado um inteiro, retorne todos os seus divisores, e não podemos usar recursão explícita. Vamos usar ferramentas da biblioteca padrão, como list comprehension ou higher-order functions, para gerar e filtrar a lista.

Passo 2

Vamos primeiro definir a assinatura de tipo para deixá-la genérica sobre qualquer tipo integral. Em Haskell escrevemos:

Passo 3

A ideia principal é gerar todos os números de 1 até n e depois filtrar apenas aqueles que dividem n sem resto. Podemos fazer isso de duas maneiras:
  1. Usando list comprehension: para cada d em [1…n], mantemos só os que satisfazem n mod d == 0.
  2. Usando filter com uma função anônima que testa o resto da divisão.

Passo 4

Para confirmar, podemos testar manualmente: por exemplo, para n = 12, a lista [1…12] é filtrada e sobra [1,2,3,4,6,12], que são todos os divisores de 12.

Resposta

divisores :: Integral a => a -> [a]
divisores n = [ d | d <- [1…n], n mod d == 0 ]

Exercícios relacionados