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

Ral*_*ang 2 floating-point int haskell

我有一个函数接受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))
Run Code Online (Sandbox Code Playgroud)

我怎么能通过这个?

C. *_*ann 12

表达式log . fromIntegral n相当于log . (fromIntegral n),而不是(log . fromIntegral) n,这可能是您想要的.只是log (fromIntegral n)可能更可读,虽然.

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