2009-10-15 84 views
1

下面的代碼編譯就好了,但我不能用我的功能:如何解決這個不明確的類型變量錯誤?

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) 

錯誤:

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) 

爲什麼會出現這種情況,如何能我解決這個問題?我在Windows下運行GHC 6.10.4,如果這是相關的。

我已經採取了看看這個相關question,但不認爲這解決了我的需要。

回答

4

我不太知道什麼功能是應該做的,但你的問題似乎是您使用天花板,其類型爲

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

這將迫使整個結果是在班級積分,這可能不是你想要的。添加FromIntegral,從而改變最後一行

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

使函數編譯,並賦予它的類型

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

@Tirpen:你一針見血的頭部。我認爲'天花板'也是問題。謝天謝地,'fromIntegral'的存在是爲了解決這種情況。 – Zaid 2009-10-15 16:20:30