Practico 6 Ej 2

Practico 6 Ej 2

de Rodrigo Alain De La Vega Rodriguez -
Número de respuestas: 3

Buenas, estoy tratando de hacer este ejercicio pero me da un error que no estoy pudiendo resolver al usar sqrt. Me pueden decir que tengo mal? Gracias!
El código de mi solución es:

getDivisores :: Int -> Int -> [Int]
getDivisores x n | x > (sqrt n)  = []
                 | (mod) x n == 0 = x : getDivisores (x + 1)  n
                 | otherwise      = getDivisores (x + 1)  n

divisores :: IO ()
divisores = getInt >>= (\n -> print $ getDivisores 1 n)

Pero al tratar de compilar me dice:
Ej.hs:18:25: error:
    * No instance for (Floating Int) arising from a use of `sqrt'
    * In the second argument of `(>)', namely `(sqrt n)'
      In the expression: x > (sqrt n)
      In a stmt of a pattern guard for
                     an equation for `getDivisores':
        x > (sqrt n)
   |
18 | getDivisores x n | x > (sqrt n)  = []
   |                                           ^^^^^^


En respuesta a Rodrigo Alain De La Vega Rodriguez

Re: Practico 6 Ej 2

de Marcos Viera - InCo -
El tipo de sqrt es:
sqrt :: Floating a => a -> a

Pero vos al hacer x > (sqrt n), dado que x es de tipo Int, estás pidiendo que (srqt n) tenga tipo Int. El problema es que Int no es instancia de Floating, que es lo que te dice el error. Una posible solución a ese error es hacer una coerción del tipo de x, haciendo:
fromInteger x > sqrt n

saludos
En respuesta a Marcos Viera - InCo

Re: Practico 6 Ej 2

de Rodrigo Alain De La Vega Rodriguez -
Marcos, buenas noches. Entiendo todo lo que decís e incluso ya lo había probado pero la solución que propones no me funciona.

Couldn't match expected type `Integer' with actual type `Int'
* In the first argument of `fromInteger', namely `x'
In the first argument of `(>)', namely `(fromInteger x)'
In the expression: (fromInteger x) > (sqrt n)

Gracias! Saludos