Haskell中的模糊实例

时间:2016-04-01 08:01:18

标签: haskell

我只是在Haskell中编写一个简单的代码,

coo x y = ((lim-1)*y*(y-1)`div`2) + (y*(y-1)*(sum (map (\j->(x`div`j)-j)  [2..lim] )))
  where
    lim = floor (sqrt x)

但是当我使用' coo 10 10'在ghci中,它给出了以下错误:

<interactive>:3:1:
No instance for (Floating a0) arising from a use of ‘it’
The type variable ‘a0’ is ambiguous
Note: there are several potential instances:
  instance Floating Double -- Defined in ‘GHC.Float’
  instance Floating Float -- Defined in ‘GHC.Float’
In the first argument of ‘print’, namely ‘it’
In a stmt of an interactive GHCi command: print it

发生什么事了?我确信我匹配所有类型的正确。

1 个答案:

答案 0 :(得分:4)

如果仔细观察(或询问GHCi),您会​​看到您的函数具有类型

coo :: (Floating a, Integral a, RealFrac a) => a -> a -> a

告诉GHC使用aFloating的某种类型Integral,这将变得困难(Prelude中没有此类型)

我不是100%确定您要做的是什么,但解决此问题的一种方法是将lim更改为:

lim = floor (sqrt $ fromIntegral x)

这将产生

λ> coo 10 10
360