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.

È stato utile?

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
scroll top