Come posso risolvere questo errore variabile di tipo ambiguo?
Domanda
Il seguente codice compila bene, ma non posso usare la mia funzione:
codice:
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)
ERRORE:
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)
Perché succede questo, e come posso risolvere questo? Sono in esecuzione GHC 6.10.4 sotto Windows, se questo è affatto rilevante.
Ho già dato un'occhiata a questo correlato domanda , ma non credo che si rivolge il mio bisogno.
Soluzione
Io non sono molto sicuro di quello che si suppone la funzione di fare, ma il problema sembra essere che si utilizza soffitto , che è di tipo
(RealFrac a, Integral b) => a -> b
In questo modo l'intero risultato di essere nella classe integrale, che probabilmente non è ciò che si vuole. Aggiungendo un FromIntegral e cambiando così l'ultima riga
g n x = ((map (\z -> (fromIntegral $ ceiling z)^2) (1:[0.5,1..]))!!(n-1))*x / ((g (n+1) x) + fromIntegral n)
Rende la funzione di compilazione e gli dà il tipo
g :: (Fractional b) => Int -> b -> b
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow