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:
- Usando list comprehension: para cada d em [1…n], mantemos só os que satisfazem n
mod
d == 0. - 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
divisores n = [ d | d <- [1…n], n
mod
d == 0 ]