2017-09-21 4 views
3

Je souhaite que ma fonction lit un entier et renvoie la racine carrée arrondie à l'entier le plus proche. Voilà ce que j'ai essayé:Utilisation conjointe de floor et sqrt dans Haskell

roundSqrt :: Int -> Int 
roundSqrt x = floor (sqrt x) 

L'erreur que je reçois est: «Impossible de déduire (Floating a) résultant d'une utilisation de -sqrt», mais je ne comprends pas ce que cela signifie.

Répondre

6

Le type de sqrt est:

λ> :t sqrt 
sqrt :: Floating a => a -> a 

Le type de sol est:

λ> ::t floor 
floor :: (RealFrac a, Integral b) => a -> b 

Ainsi, sqrt a besoin d'un type qui a une contrainte Floating. Vous pouvez utiliser la fonction fromIntegral pour y parvenir:

roundSqrt :: Int -> Int 
roundSqrt x = floor (sqrt (fromIntegral x)) 
+0

Ensuite, vous débarrasser des passe-partout en utilisant l'opérateur de composition: 'roundSqrt = étage. sqrt. fromIntegral'. – chepner