此代码有效:
posToXY :: Float -> Float -> Integer
posToXY a b = do
let y = a / b
round y
但这不起作用:
posToXY :: Integer -> Integer -> Integer
posToXY a b = do
let y = a / b
round y
我理解操作'/'没有为Integer类型定义,但我不知道如何修复代码以使用Integer参数。
答案 0 :(得分:27)
如果您要执行小数除法,可以使用Integral
或fromIntegral
从任何fromInteger
类型进行转换,只能专门从Integer
转换。
有与其他数字类型相关的类似功能:toRational
,fromRational
,realToFrac
等。当然,您可以使用{{1将小数类型转换回整数类型}},round
,floor
等。
最后,关于你实际想要整数除法的概率,而不是事后舍入的小数除法,有ceiling
和div
函数(取决于什么你想要的截断行为。
此外,您可能应该将您的功能编写为quot
之类的内容。不必要的posToXY a b = round $ a / b
和多行使得阅读更加困难。
答案 1 :(得分:7)
您可以使用fromIntegral
将任何积分类型转换为任何Num类型。所以:
let y = fromIntegral a / fromIntegral b
答案 2 :(得分:7)
您的代码可以轻松简化为
posToXY :: Float -> Float -> Integer
posToXY a b = round (a / b)
然后
posToXY :: Integer -> Integer -> Integer
posToXY a b = round (fromIntegral a / fromIntegral b)
答案 3 :(得分:3)
如果您想要整数除法,可以使用div
。
posToXY :: Integer -> Integer -> Integer
posToXY = div
请注意,这与舍入浮点除法并不完全相同,因为div
总是向下舍入。
对于更通用的类型签名,您可以改为执行此操作
p :: (Real a, Real a1, Integral b) => a -> a1 -> b
posToXY a b = round (realToFrac a / realToFrac b)