parse float convert haskell types sqrt

float - Obtener sqrt de Int en Haskell



ord haskell (3)

¿Quizás quieres que el resultado sea un Int también?

isqrt :: Int -> Int isqrt = floor . sqrt . fromIntegral

Es posible que desee reemplazar el floor con ceiling o round . (Por cierto, esta función tiene un tipo más general que el que di).

¿Cómo puedo obtener sqrt desde Int .

Lo intento así:

sqrt . fromInteger x

Pero consigue error con la compatibilidad de tipos.


Recuerde, la aplicación se enlaza más fuertemente que cualquier otro operador. Eso incluye la composición. Lo que quieres es

sqrt $ fromIntegral x

Entonces

fromIntegral x

se evaluará primero, porque la aplicación implícita (espacio) se enlaza más estrechamente que la aplicación explícita ($).

Alternativamente, si quieres ver cómo funcionaría la composición:

(sqrt . fromIntegral) x

Los paréntesis aseguran que el operador de la composición se evalúa primero, y luego la función resultante es el lado izquierdo de la aplicación.


Utilizando fromIntegral :

Prelude> let x = 5::Int Prelude> sqrt (fromIntegral x) 2.23606797749979

Tanto Int como Integer son instancias de Integral :

  • fromIntegral :: (Integral a, Num b) => a -> b toma su Int (que es una instancia de Integral ) y "lo convierte" en un Num .

  • sqrt :: (Floating a) => a -> a espera una herencia Floating y Floating de Fractional , que se hereda de Num , por lo que puede pasar a sqrt el resultado de fromIntegral de forma fromIntegral

Creo que el diagram clases en el Wikibook de Haskell es bastante útil en estos casos.