web-dev-qa-db-fra.com

Obtenez sqrt de Int à Haskell

Comment puis-je obtenir sqrt de Int.

J'essaye donc:

sqrt . fromInteger x

Mais obtenez une erreur avec la compatibilité des types.

27
0xAX

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.

39
MarcoS

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é.)

40
augustss

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.

11
Edward