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