我想在Haskell中划分两个Int
值并将结果作为Float
获得。我尝试这样做:
foo :: Int -> Int -> Float
foo a b = fromRational $ a % b
但GHC(版本6.12.1)告诉我“无法将预期类型'整数'与推断类型'Int'相匹配”关于表达式中的a
。
我理解为什么:fromRational
调用需要(%)
来生成Ratio Integer
,因此操作数必须是Integer
而不是Int
。但是我正在划分的值远远超出Int
范围限制,因此使用任意精度的bignum类型似乎有点矫枉过正。
这样做的正确方法是什么?我应该在我的操作数上调用toInteger
,还是有更好的方法(可能不涉及(%)
和比率)我不知道?
答案 0 :(得分:35)
您必须将操作数转换为浮点数首先然后除以,否则您将执行整数除法(无小数位)。
Laconic解决方案(需要Data.Function
)
foo = (/) `on` fromIntegral
是
的缩写foo a b = (fromIntegral a) / (fromIntegral b)
与
foo :: Int -> Int -> Float