没有实例(Floating Int)

时间:2009-12-28 17:16:44

标签: haskell types ghc typeclass

我正在学习Haskell。我创建了函数,它将乘法表返回到'b'中的'n'。数字填充为'w'数字。作为最后一步,我想自动计算'w'。为什么这不编译?

-- Number of digits needed for the multiplication table n*n in base 'base'
nOfDg :: Int -> Int-> Int 
nOfDg n base = 1 + floor ( logBase base (n*n)) 

错误:

No instance for (Floating Int)
     arising from a use of `logBase' at C:\haskel\dgnum.hs:4:24-38
   Possible fix: add an instance declaration for (Floating Int)
   In the first argument of `floor', namely `(logBase b (n * n))'
   In the second argument of `(+)', namely `floor (logBase b (n * n))'
   In the expression: 1 + floor (logBase b (n * n))

3 个答案:

答案 0 :(得分:11)

logBase采用两个实现浮动类型类的参数。在将参数传递给logBase之前,您需要在参数上调用fromIntegral。这是为我编译的6.10.3:

nOfDg :: Int -> Int-> Int
nOfDg n base = 1 + floor ( logBase (fromIntegral base) (fromIntegral (n*n)))

你必须记住Haskell是非常强类型的,所以你不能只假设提供给你的函数的Int参数会被自动强制转换为日志函数通常采用的浮点数。

答案 1 :(得分:5)

声明

logBase可用于浮点类型。 Int不是浮点类型,有no automatic conversion in Haskell。试试这个:

-- Number of digits needed for the multiplication table n*n in base 'base'
nOfDg :: Int -> Float -> Int
nOfDg n base = 1 + floor (logBase base (fromIntegral (n*n)))

答案 2 :(得分:3)

来自序曲:

logBase :: Floating a => a -> a -> a

这意味着使用logBase必须使用浮动类型。但是Int不是浮动类型,并且数字类型没有自动转换,因此您必须将它从Int转换为浮动类型:

nOfDg n base = 1 + floor ( logBase (toEnum base) (toEnum n))

toEnum函数将int作为参数并返回“Enum”类型。好的部分是Float是Enum的一个实例,所以你可以使用它

toEnum :: Enum a => Int -> a

你应该在haskell中读取/记录有关数字类型(Num,Fractional,Integral,Floating ...)的标准类型类,因为它们经常在代码中弹出,学习转换可能很有用。

编辑:这个Haskell Wiki Book提供了标准类型类之间关系的非常有用的图形,包括数字类型。