Así que estoy trabajando en Problem 31.La función `(y * y) <x 'se aplica a dos argumentos, pero su tipo` Bool' no tiene ninguno
he escrito la siguiente función con la esperanza de determinar si un número es primo:
isPrime :: Integer -> Bool
isPrime x = prime x 2
where
prime :: Integer -> Integer -> Bool
prime x y | ((y*y) < x) and ((x `mod` y) /= 0) = prime x (y+1)
| ((y*y) >= x) = True
| otherwise = False
Mi lógica era hacer una función isPrime
, y tienen una función dentro de isPrime
llamada prime
para almacenar 2 parámetros, las número Quiero verificar si es primo (x
) y un iterador para verificar todos los números debajo de sqrt de x y ver si dividen x
. prime
tiene 3 guardias:
| ((y*y) < x) and ((x `mod` y) == 0) = prime x (y+1)
Esta línea se supone que decir: es el número pasé menos de la raíz cuadrada de x (((y*y) < x)
) y si se trata de comprobar si x
es divisible por y
(((x
mod y) /= 0)
) , si no es así, uso recursión e incremento y para volver a verificar con un número mayor.
Esta línea:
| ((y*y) >= x) = True
se supone que es como si todos los números por debajo de la raíz cuadrada no se dividen x de todos modos, x debe ser primordial.
Finalmente, esta línea:
| otherwise = False
significa que un número en algún lugar a lo largo de la línea de un número x dividido por lo que no es primo.
Pensé que el código que escribí tenía sentido, sé que no es el más eficiente, teniendo en cuenta que podría verificar primos por debajo de sqrt x y no todos los números por debajo de sqrt x, pero de todos modos, tengo problemas con esto declaración:
((y*y) < x)
GHCi dice:
The function `(y * y) < x' is applied to two arguments, but its type `Bool' has none
pensé que el <
se suponía que tomar en dos argumentos y devolver una Bool, el mensaje de error no tiene mucho sentido para mí. ¿Puedes ayudarme a descubrir qué estoy haciendo mal? Gracias.
Edición rápida ahora que lo tengo a correr, esta línea:
| ((y*y) >= x) = True
debería ser:
| ((y*y) > x) = True
Urgh. ¿Alguien sabe cómo incluir palos en el backticks en SO? Parece que no puedo escapar de ellos. – porges
'&&' es la función para "lógico y", con tipo 'Bool -> Bool -> Bool'. 'y' es una función similar con el tipo' [Bool] -> Bool', por lo que colocar palos de atrás no ayudará aquí. – Ben
@Porges: solucioné eso para ti. Por lo que sé, necesitas usar '
...
' con barras invertidas que se escapan hacia adentro. –