以下代码编译得很好,但我无法使用我的函数:
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,但不认为它符合我的需要。
答案 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