Что правильный путь состоит в том, чтобы разделить два Международных значения для получения Плавания?

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

29
задан Don Stewart 20 April 2011 в 22:48
поделиться

1 ответ

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

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

foo = (/) `on` fromIntegral

, что является сокращением от

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

с

foo :: Int -> Int -> Float
36
ответ дан 28 November 2019 в 01:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: