erreur de type GHC que je ne comprends pas
Question
Je suis moi-même enseigne Haskell.
Je veux écrire une fonction récursive qui trouve le premier nombre entier qui a une racine carrée, et est inférieur à un nombre de départ.
Il ressemble à ceci:
findFirstSquare :: Int -> Int
findFirstSquare x
| x <= 0 = error "This function only works for 1 or above"
| fromInteger(floor(sqrt(x))) == (sqrt x) = x
| otherwise = intSqrt(x - 1)
Mais GHC se plaint:
Aucun cas pour (Int RealFrac) résultant d'une utilisation du `étage » à ...
Cependant, si je tape ce qui suit dans GHCi, il compile heureusement il:
fromInteger(floor(sqrt(4))) == (sqrt 4)
Ma question est: Pourquoi suis-je recevoir une erreur de type d'une expression qui compile avec succès dans GHCi
La solution
Ok, je compris.
La différence est que la constante "4" est surchargé, de sorte interactive sqrt (4) est d'obtenir la racine carrée de la Float 4
Cependant ma fonction déclare x comme Int , donc je devais ajouter un fromIntegral aux appels à sqrt, de sorte qu'ils travailleraient.
Changement de la moyenne garde à ce qui suit a fait l'affaire:
| fromIntegral(floor(sqrt(fromIntegral(x)))) == (sqrt(fromIntegral(x))) = x