Pregunta

Estoy enseñando a mí mismo Haskell.

Quiero escribir una función recursiva que encuentra el primer número que tiene una raíz cuadrada entera y es más pequeño que un número inicial.

Se ve así:

findFirstSquare :: Int -> Int
findFirstSquare x
    | x <= 0                                  = error "This function only works for 1 or above"
    | fromInteger(floor(sqrt(x))) == (sqrt x) = x
    | otherwise                               = intSqrt(x - 1)

Pero GHC se queja:

  

Ningún caso de (RealFrac Int) gracias a la utilización de `baja' en ...

Sin embargo, si escribo lo siguiente en GHCi, felizmente lo compila:

 fromInteger(floor(sqrt(4))) == (sqrt 4)

Mi pregunta es: ¿Por qué recibo un error de tipo de una expresión que compila con éxito en GHCi

¿Fue útil?

Solución

Ok, lo he descubierto.

La diferencia es que la constante "4" está sobrecargado, de forma interactiva sqrt (4) está recibiendo la raíz cuadrada de la Flotador 4

Sin embargo, mi función declara ax como un Int , por lo tanto necesario añadir un fromIntegral a las llamadas a sqrt, por lo que iban a trabajar.

Cómo cambiar el protector medio con la siguiente resolvieron el problema:

| fromIntegral(floor(sqrt(fromIntegral(x)))) == (sqrt(fromIntegral(x))) = x
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top