Questão 5 (DESAFIO): Escreva uma função em Haskell, que receba um número
e retorne uma lista com os
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
isPrime m = m > 1 && all (\k -> m
mod
k /= 0) [2…floor (sqrt (fromIntegral m))]primes :: [Int]
primes = filter isPrime [2…]
primes = filter isPrime [2…]
firstNPrimes :: Int -> [Int]
firstNPrimes n = take n primes
firstNPrimes n = take n primes