题
我学习Haskell。我已经创建函数返回乘法表达“n”个碱基“B”。数字被填充到“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))
解决方案
logBase取它们实现浮动类型类两个参数。你需要将它们传递给logBase前致电fromIntegral的参数。这编译为我6.10.3:
nOfDg :: Int -> Int-> Int
nOfDg n base = 1 + floor ( logBase (fromIntegral base) (fromIntegral (n*n)))
您必须记住,Haskell是非常强类型的,所以你不能只是假设,提供给你的函数int参数将自动强制转换为浮点数该日志功能一般取。
其他提示
logBase
被声明为工作对浮点类型。 int是不是一个浮点型和有在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)))
从前奏:
logBase :: Floating a => a -> a -> a
这意味着,使用logBase必须使用浮动型。但int是不是一个浮点类型,并没有对数字类型的自动转换,所以你必须把它从int转换为浮动型:
nOfDg n base = 1 + floor ( logBase (toEnum base) (toEnum n))
的toEnum函数采取一个int作为参数并返回一个“枚举”类型的。好的一面是,浮子枚举的一个实例,所以你可以使用它
toEnum :: Enum a => Int -> a
您应该在Haskell数值类型(数字,分数,整型,浮点...)读/你有关标准型的类文件,因为他们经常弹出代码,学习的转换可能是有用的。
编辑:此的Haskell维基版提供标准之间的关系的一个非常有用的图形键入类,包括数字类型。
不隶属于 StackOverflow