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

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top