O crivo de Eratóstenes é um algoritmo com 2300 anos. Aqui está uma solução na moderna (de 1998) linguagem de programação Haskell:
primos = crivo [2..]
where
crivo (p : ns) = p : crivo (filter (notdiv p) ns)
notdiv d n = n `mod` d /= 0 Que falta faz a semântica!