Tu definición de primos no arroja el resultado que das entre
paréntesis. Por lo menos en mi ejecución primos 10 me arrojó
[2,3,5,7], lo cual lo veo muy bien, y tiene que ver con la definición
de la primalidad del número 1
(http://es.wikipedia.org/wiki/NC3%BAmero_primo#Primalidad_del_n.C3.BAmero_1)
Usando tus definiciones, te acerco una en un renglón (en realidad,
cambién un poquito la definición de "primo"). No sé si es la mejor, ni
la más corta o eficiente, pero creo que sirve como primer paso:
primos2 n = [ x | x <- [2..n], length ([ y | y <- [1..x], x `mod` y ==
0]) == 2 ]
--
Explicación:
Empecé con tu definición:
primos n = [ x | x <- [2..n], primo x]
Ahora, reemplazo la definición de primo, por lo que corresponde:
primos n = [ x | x <- [2..n], divisores x == [1,x]]
Acá hice un pequeño cambio, y en vez de pedir que sean ==, pido que
tengan dos elementos (es equivalente, pero a mí personalmente me gusta
más porque no depende del orden de los elementos de la lista):
primos n = [ x | x <- [2..n], length (divisores x) == 2]
Ahora, reemplazo la definición de divisores, teniendo en cuenta de no
mezclar los nombres en ambas definiciones:
primos n = [ x | x <- [2..n], length ([ y | y <- [1..x], x `mod` y == 0]) == 2]
Saludos,
waldo
2011/9/5 Marcos <marcosp...@gmail.com>: