UTNianos

Versión completa: Problema HASKELL (numeros primos)
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Que tal gente tengo este problema: cuando infiero la base de conocimientos de Hugs con este codigo

primos :: Int -> Bool
primos 1 = True
primos 2 = True
primos x = if ((odd x) && (primos(truncate (sqrt x)))) == True then True
else False


me tira el siguiente error:

Instances of (Floating Int, RealFrac Int) required for definition of primos


muchas gracias!
Hola, de dónde sacaste esa definición de primo?

El 23 es primo. 23 cumple con odd 23, pero la raíz truncada de 23 es 4, y 4 no es primo. Eso da false y por ser un && todo da false. Pero 23 es primo.

El 25 no es primo. 25 cumple con odd 25, pero la raíz truncada de 25 es 5, y 5 sí es primo. Eso da true y por ser un && todo da true. Pero 25 no es primo.

Saludos
¡Aloha!

En general, el "if ... then true, else false" es un error, dado que es redundate - la condición del if ya da true o false, así que con poner únicamente la condición, debería estar bien, y sin redundancia.

Además de lo que menciona Focus, claro.


Pero tu consulta no era por eso, si no por el error de Haskell.

Fijate que te está diciendo algo de Floating Int y RealFrac Int - pero en ambos casos habla de Ints.

El sistema de tipos de Haskell es súper potente, y probablemente el problema sea un detalle de implementación. Mis sospechas van a algo como que el tipo Int en realidad sean un montón de tipos raros, o no se qué, y que por eso Haskell se queja de que le pongas como limitación Int en lugar de, no se, algo como Integral o andá a saber.

Mi consejo es que pruebes el mismo código sin declararle los tipos arriba, a ver qué infiere Haskell (dependiendo de la versión que uses y qué se yo, creo que con `:t nombreFuncion` en la consola te dice el tipo qué Haskell infirió). Capaz eso ayuda a entender la diferencia entre lo que Haskell espera y lo que vos pusiste.

O repasate los apuntes y ejemplos vistos en clase, a ver si los Ints los declaraban así o de otro modo.


La otra es revisar el tipo que devuelve truncate, a ver si tu función primo está restringiendo más de lo que debe (o si te falta hacerle algo más al resultado de truncate - algún "as integer" o algo así, capaz).
Hola, aparte de las cosas que te comentaron (que eso da como primos cosas que no son primos, y que el if es redundante), haskell está rompiendo porque estás usando las funciones truncate y sqrt sobre un Int, cuando esas funciones necesitan algo que sea un numero RealFrac y Floating respectivamente. Basicamente te esta diciendo que tiene que ser un numero con coma, que para haskell son diferentes de los numeros enteros (hay formas de convertir de un entero a algo que es uno con coma así se puede operar).


PD: haskell no tiene una base de conocimientos, eso es prolog.
Muchas gracias a todos! Ya encontre una solucion hace rato, no tuve tiempo de agradecerles.
Nos vemos!
Comparta, maestr@! =)
factores :: Int -> [Int]
factores n = [x | x <- [1..n], n `mod` x == 0]

esPrimo :: Int -> Bool
esPrimo n = factores n == [1,n]

primos :: [Int] -> [Int]
primos n = [x | x <- [2..n], esPrimo x]


creo que esta vez esta bien jajaja si ven algún error me avisan. Gracias gente!
URLs de referencia