如何解决这种模糊的类型变量错误?

时间:2009-10-15 11:40:05

标签: haskell types typeclass

以下代码编译得很好,但我无法使用我的函数:

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)

ERROR:

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,但不认为它符合我的需要。

1 个答案:

答案 0 :(得分:4)

我不太确定该功能应该做什么,但你的问题似乎是你使用 ceiling ,它有类型

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

这会强制整个结果都在Integral类中,这可能不是你想要的。添加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