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 -> btoma suInt(que es una instancia deIntegral) y "lo convierte" en unNum.sqrt :: (Floating a) => a -> aespera una herenciaFloatingyFloatingdeFractional, que se hereda deNum, por lo que puede pasar asqrtel resultado defromIntegralde formafromIntegral
Creo que el diagram clases en el Wikibook de Haskell es bastante útil en estos casos.