将两个 Int 值相除以获得 Float 的正确方法是什么?

发布于 2024-09-10 05:29:46 字数 551 浏览 1 评论 0原文

我想在 Haskell 中除以两个 Int 值并获得 Float 形式的结果。我尝试这样做:

foo :: Int -> Int -> Float
foo a b = fromRational $ a % b

但 GHC(版本 6.12.1)告诉我“无法将预期类型“Integer”与推断类型“Int”匹配”(关于表达式中的 a)。

我明白为什么:fromRational 调用需要 (%) 来生成 Ratio Integer,因此操作数需要为 Integer 类型 而不是 Int。但我要除的值远未接近 Int 范围限制,因此使用任意精度的 bignum 类型似乎有点矫枉过正。

这样做的正确方法是什么?我应该对我的操作数调用 toInteger 吗?还是有一种我不知道的更好的方法(也许不涉及 (%) 和比率)?

I'd like to divide two Int values in Haskell and obtain the result as a Float. I tried doing it like this:

foo :: Int -> Int -> Float
foo a b = fromRational $ a % b

but GHC (version 6.12.1) tells me "Couldn't match expected type 'Integer' against inferred type 'Int'" regarding the a in the expression.

I understand why: the fromRational call requires (%) to produce a Ratio Integer, so the operands need to be of type Integer rather than Int. But the values I'm dividing are nowhere near the Int range limit, so using an arbitrary-precision bignum type seems like overkill.

What's the right way to do this? Should I just call toInteger on my operands, or is there a better approach (maybe one not involving (%) and ratios) that I don't know about?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

清秋悲枫 2024-09-17 05:29:46

您必须首先将操作数转换为浮点数,然后进行除法,否则您将执行整数除法(没有小数位)。

简洁的解决方案(需要Data.Function),

foo = (/) `on` fromIntegral

缩写

foo a b = (fromIntegral a) / (fromIntegral b)

它是with 的

foo :: Int -> Int -> Float

You have to convert the operands to floats first and then divide, otherwise you'll perform an integer division (no decimal places).

Laconic solution (requires Data.Function)

foo = (/) `on` fromIntegral

which is short for

foo a b = (fromIntegral a) / (fromIntegral b)

with

foo :: Int -> Int -> Float
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文