Я хотел бы разделиться два Int
значения в Haskell и получают результат как a Float
. Я пытался делать его как это:
foo :: Int -> Int -> Float
foo a b = fromRational $ a % b
но GHC (версия 6.12.1) говорит мне, "Не мог соответствовать ожидаемому типу 'Целое число' против выведенного типа 'Интервал'" относительно a
в выражении.
Я понимаю почему: fromRational
вызов требует (%)
произвести a Ratio Integer
, таким образом, операнды должны иметь тип Integer
вместо Int
. Но значения, которые я делю, нигде не около Int
расположитесь предел, так с помощью типа сверхбольшого числа произвольной точности походит на излишество.
Что правильный путь состоит в том, чтобы сделать это? Если я просто звоню toInteger
на моих операндах, или там лучший подход (возможно, один не вовлечение (%)
и отношения), что я не знаю о?
Вы сначала нужно преобразовать операнды в числа с плавающей запятой , а затем разделить, иначе вы выполните целочисленное деление (без десятичных знаков).
Лаконичное решение (требуется Data.Function
)
foo = (/) `on` fromIntegral
, что является сокращением от
foo a b = (fromIntegral a) / (fromIntegral b)
с
foo :: Int -> Int -> Float