这真让我烦恼。我想找到最大的m,使得2 ^ m <1。 ñ。 这就是我所做的:
m = floor $ toRational $ logBase 2 n
GHCI抱怨:
No instance for (Floating Int) arising from a use of ‘logBase’
In the second argument of ‘($)’, namely ‘logBase 2 n’
In the second argument of ‘($)’, namely ‘toRational $ logBase 2 n’
In the expression: floor $ toRational $ logBase 2 n
我不明白为什么,因为:
*Main> :t logBase
logBase :: Floating a => a -> a -> a
*Main> :t toRational
toRational :: Real a => a -> Rational
*Main> :t floor
floor :: (RealFrac a, Integral b) => a -> b
logBase
会返回Floating
,而toRational
会接受Real
:这必须有效,因为Floating
如何才能成为Real
}。然后toRational
返回Rational
,而floor
则接受RealFrac
。我不知道那是什么(我尝试使用:info RealFrac
查找但输出效果不大),但Rational
如何不是RealFrac
?
错误与Floating Int
有关,你能为我揭示这个吗?作为第二个问题,我怎样才能获得有关GHCI内部RealFrac
等奇怪类型的更多信息?正如我所说:info RealFrac
对我没有多大帮助。
答案 0 :(得分:4)
n
类型Int
似乎没有Floating
的实例。您可以使用fromIntegral
:
m = floor $ toRational $ logBase 2 (fromIntegral n)