Questão 5 (DESAFIO): Escreva uma função em Haskell, que receba um número n e retorne uma lista com os n primeiros números primos.

Passo 1

O enunciado pede para escrever em Haskell uma função que, dado um número inteiro n, retorne uma lista com os n primeiros números primos. Para isso precisamos entender o que é um número primo, como testar primalidade e usar a avaliação preguiçosa de listas em Haskell.

Passo 2

Primeiro definimos uma função auxiliar de primalidade. Um número m > 1 é primo se não existir nenhum divisor k entre 2 e √m. Em Haskell podemos escrever: isPrime m = m > 1 && all (\k -> m mod k /= 0) [2…floor (sqrt (fromIntegral m))]. Aqui convertemos m para Float com fromIntegral para usar sqrt, depois floor para obter o teto inteiro.

Passo 3

Em seguida geramos uma lista infinita de candidatos a primo filtrando todos os inteiros a partir de 2 com isPrime. Graças ao lazy evaluation do Haskell, essa lista só será computada até onde for necessário: primes = filter isPrime [2…].

Passo 4

Finalmente, a função pedida usa take para extrair os n primeiros elementos dessa lista infinita de primos: firstNPrimes n = take n primes.

Resposta

isPrime :: Int -> Bool
isPrime m = m > 1 && all (\k -> m mod k /= 0) [2…floor (sqrt (fromIntegral m))]
primes :: [Int]
primes = filter isPrime [2…]
firstNPrimes :: Int -> [Int]
firstNPrimes n = take n primes

Exercícios relacionados