Comment puis-je résoudre cette erreur variable de type ambigu?
Question
Le code suivant compile très bien, mais je ne peux pas utiliser ma fonction:
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 puis-je travailler autour de cela? Je suis en cours d'exécution sous Windows GHC 6.10.4, si cela est du tout pertinent.
Je l'ai déjà pris un coup d'œil à ce lié question , mais ne pas pense qu'il répond à mes besoins.
La solution
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 force tout le résultat d'être dans la classe intégrale, ce qui est sans doute 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)
Makes la compilation de la fonction et il donne le type
g :: (Fractional b) => Int -> b -> b