我有一个函数接受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))
我怎样才能解决这个问题?
答案 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