代码之家  ›  专栏  ›  技术社区  ›  Zaid

如何解决此不明确的类型变量错误?

  •  1
  • Zaid  · 技术社区  · 15 年前

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

    代码:

    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 但别以为它能满足我的需要。

    1 回复  |  直到 13 年前
        1
  •  4
  •   Tirpen    15 年前

    我不太确定这个函数应该做什么,但你的问题似乎是你使用了 天花板 ,具有类型

    (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