Как правильно разделить два значения Int для получения Float? - PullRequest
29 голосов
/ 18 июля 2010

Я хотел бы разделить два значения Int в Haskell и получить результат как 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 для своих операндов, или есть лучший подход (возможно, не включающий (%) и отношения), о котором я не знаю?

1 Ответ

35 голосов
/ 18 июля 2010

Вы должны преобразовать операнды в числа с плавающей запятой сначала , а затем делить, иначе вы выполните целочисленное деление (без десятичных разрядов).

Лаконичный раствор (требуется Data.Function)

foo = (/) `on` fromIntegral

что сокращенно от

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

с

foo :: Int -> Int -> Float
...