¿Cómo puedo obtener sqrt
desde Int
.Obtener sqrt desde Int en Haskell
Trato de modo:
sqrt . fromInteger x
Pero da error con la compatibilidad de tipos.
¿Cómo puedo obtener sqrt
desde Int
.Obtener sqrt desde Int en Haskell
Trato de modo:
sqrt . fromInteger x
Pero da error con la compatibilidad de tipos.
Usando fromIntegral
:
Prelude> let x = 5::Int
Prelude> sqrt (fromIntegral x)
2.23606797749979
ambos Int
y Integer
son instancias de Integral
:
fromIntegral :: (Integral a, Num b) => a -> b
toma su Int
(que es una instancia de Integral
) y "hace" un Num
.
sqrt :: (Floating a) => a -> a
espera un Floating
, y Floating
Heredar del Fractional
, que hereda de Num
, por lo que puede pasar con seguridad a sqrt
el resultado de fromIntegral
Creo que las clases diagram en Haskell Wikibook es bastante útil en este caso.
Recuerde, la aplicación se une más estrechamente que cualquier otro operador. Eso incluye la composición. Lo que queremos es
sqrt $ fromIntegral x
Entonces
fromIntegral x
serán evaluados en primer lugar, porque la aplicación implícita (espacio) se une más estrechamente que la aplicación explícita ($).
Alternativamente, si desea ver cómo funcionaría composición:
(sqrt . fromIntegral) x
paréntesis asegurarse de que el operador de composición se evalúa primero, y luego la función resultante es el lado izquierdo de la aplicación.
Quizás también quieras que el resultado sea Int
?
isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral
Es posible que desee reemplazar floor
con ceiling
o round
. (Por cierto, esta función tiene un tipo más general que la que di).
ghc advierte sobre esto, ya que no sabe qué tipo exacto usar entre 'fromIntegral' y' floor' (podría ser 'Double',' Float', etc.). Para arreglar: 'isqrt x = piso.sqrt $ (fromIntegral x :: Float) ', que es menos elegante :( –
Me gusta, de todos modos. No advierte sobre GHC 8. –
¿Podría 'sqrt (fromIntegral x)' también escribirse como 'sqrt $ fromIntegral x'? – rzetterberg
Sí, de hecho podría, ya que la aplicación explícita ($) no se vincula tan estrechamente como la aplicación implícita. – Edward
¡sí! y también '(sqrt. fromIntegral) x' – MarcoS