在Haskell中键入函数'floor'的错误

时间:2010-12-07 00:41:51

标签: haskell floating-point int

我有一个函数接受2个I n,x,并计算floor(log n / log x)。这里n和x都非常有限,所以Int对我来说已经足够了。

func :: Int -> Int -> Int
func n x = floor (log . fromIntegral n / (log . fromIntegral x))

但是这里出现了ghci中的错误:

No instance for (RealFrac (a -> b))
  arising from a use of `floor' at p5_evenly_divide.hs:20:11-63
Possible fix: add an instance declaration for (RealFrac (a -> b))
In the expression:
    floor (log . fromIntegral n / (log . fromIntegral x))
In the definition of `func':
    func n x = floor (log . fromIntegral n / (log . fromIntegral x))

我怎样才能解决这个问题?

2 个答案:

答案 0 :(得分:12)

表达式log . fromIntegral n相当于log . (fromIntegral n),而不是(log . fromIntegral) n,这可能就是您想要的。但是,log (fromIntegral n)可能更具可读性。

对于一般的启发,当错误消息显示No instance for (RealFrac (a -> b))时,它告诉你它无法弄清楚如何将函数用作小数,它正在尝试做,因为你正在应用函数组合{{ 1}}到(.)的结果。在这种情况下,它有点迟钝。

答案 1 :(得分:4)

试试这个:

func :: Int -> Int -> Int 
func n x = floor (k n / k x) where
  k = log . fromIntegral