2009-10-15 7 views
1

Le code suivant compile très bien, mais je ne peux pas utiliser ma fonction:Comment puis-je résoudre cette erreur de variable de type ambigu?

CODE:

g :: (Fractional b, Integral b) => Int -> b -> b 
g 1 x = x/(g 2 x + 1) 
g 100 x = 2401*x/100 
g n x = ((map (\z -> (ceiling z)^2) (1:[0.5,1..]))!!(n-1))*x/((g (n+1) x) + fromIntegral n) 

ERREUR:

Ambiguous type variable `t' in the constraints: 
`Integral t' arising from a use of `g' at <interactive>:1:0-6 
`Fractional t' arising from a use of `g' at <interactive>:1:0-6 
Probable fix: add a type signature that fixes these type variable(s) 

Pourquoi est-ce qui se passe, et comment peut- Je travaille autour de ça? Je cours GHC 6.10.4 sous Windows, si cela est tout à fait pertinent.

J'ai déjà jeté un oeil à ce question, mais je ne pense pas que cela répond à mes besoins.

Répondre

4

Je ne suis pas tout à fait sûr de ce que la fonction est censé faire, mais votre problème semble être que vous utilisez plafond, qui est de type

(RealFrac a, Integral b) => a -> b 

Cela oblige tout le résultat d'être dans la classe Integral, ce qui n'est probablement pas ce que vous voulez. Ajout d'un fromIntegral et changeant ainsi la dernière ligne à

g n x = ((map (\z -> (fromIntegral $ ceiling z)^2) (1:[0.5,1..]))!!(n-1))*x/((g (n+1) x) + fromIntegral n) 

rend la compilation de la fonction et il donne le type

g :: (Fractional b) => Int -> b -> b 
+0

@Tirpen: Vous mettre le doigt dessus. Je pensais que le «plafond» était aussi le problème. Heureusement, 'fromIntegral' existe pour contourner de tels scénarios. – Zaid

Questions connexes