Comment puis-je obtenir sqrt
de Int
.
J'essaye donc:
sqrt . fromInteger x
Mais obtenez une erreur avec la compatibilité des types.
Utilisation de fromIntegral
:
Prelude> let x = 5::Int
Prelude> sqrt (fromIntegral x)
2.23606797749979
Int
et Integer
sont des instances de Integral
:
fromIntegral :: (Integral a, Num b) => a -> b
prend votre Int
(qui est une instance de Integral
) et "en fait" un Num
.
sqrt :: (Floating a) => a -> a
attend un Floating
et Floating
hérite de Fractional
, qui hérite de Num
, vous pouvez donc passer en toute sécurité à sqrt
le résultat de fromIntegral
Je pense que les classes diagramme dans Haskell Wikibook est très utile dans ce cas.
Vous souhaitez peut-être que le résultat soit également un Int
?
isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral
Vous pouvez remplacer floor
par ceiling
ou round
. (BTW, cette fonction a un type plus général que celui que j'ai donné.)
N'oubliez pas que l'application se lie plus étroitement que tout autre opérateur. Cela comprend la composition. Ce que tu veux c'est
sqrt $ fromIntegral x
Ensuite
fromIntegral x
sera évalué en premier, car l'application implicite (espace) se lie plus étroitement que l'application explicite ($).
Alternativement, si vous voulez voir comment la composition fonctionnerait:
(sqrt . fromIntegral) x
Les parenthèses s'assurent que l'opérateur de composition est évalué en premier, puis la fonction résultante est le côté gauche de l'application.