我正在学习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))
答案 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提供了标准类型类之间关系的非常有用的图形,包括数字类型。