我学习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维基版提供标准之间的关系的一个非常有用的图形键入类,包括数字类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top