分割两个Int值以获得Float的正确方法是什么?

Wyz*_*a-- 29 floating-point haskell types integer

我想Int在Haskell中划分两个值并将结果作为a Float.我尝试这样做:

foo :: Int -> Int -> Float
foo a b = fromRational $ a % b
Run Code Online (Sandbox Code Playgroud)

但是GHC(版本6.12.1)告诉我"无法将预期类型'Integer'与推断类型'Int'相匹配"关于a表达式中的内容.

我理解为什么:fromRational调用需要(%)生成一个Ratio Integer,所以操作数需要是类型Integer而不是Int.但是我正在划分的值远远没有接近Int范围限制,因此使用任意精度的bignum类型似乎有点过分.

这样做的正确方法是什么?我应该只是打电话toInteger给我的操作数,还是有一种(%)我不了解的更好的方法(可能不涉及和比率)?

Dar*_*rio 36

您必须先将操作数转换为浮点数然后除以,否则您将执行整数除法(无小数位).

简明解决方案(需要Data.Function)

foo = (/) `on` fromIntegral
Run Code Online (Sandbox Code Playgroud)

这是短的

foo a b = (fromIntegral a) / (fromIntegral b)
Run Code Online (Sandbox Code Playgroud)

foo :: Int -> Int -> Float
Run Code Online (Sandbox Code Playgroud)