Haskell,在floor,toRational和logBase之间输入不匹配

时间:2014-06-30 17:46:22

标签: haskell type-mismatch

这真让我烦恼。我想找到最大的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对我没有多大帮助。

1 个答案:

答案 0 :(得分:4)

n类型Int似乎没有Floating的实例。您可以使用fromIntegral

m = floor $ toRational $ logBase 2 (fromIntegral n)