Страницы

Поиск по вопросам

четверг, 2 мая 2019 г.

Округление до 2 знаков после запятой Haskell

Недавно начал пробовать Haskell на примере маленьких задачек - хеллоуворлдов. Сама задача состоит в том, что нужно посчитать некоторое выражение при разных x - ничего сложного. Но для красоты решил округлить ответ до 2 знаков после запятой и тут столкнулся со сложностями. Так как стандартной реализации такого округления не нашел, завелосипедил свою:
main :: IO () main = do let x = 1.7 in putStrLn $ show $ roundTo2 ((x + 1) ^ 2 + 3 * (x + 1))
roundTo2 :: Num a => a -> Float roundTo2 x = truncate (x * 100) / 100
Ругань компилятора:
Could not deduce (RealFrac a) arising from a use of \`truncate' from the context (Num a) bound by the type signature for roundTo2 :: Num a => a -> Float at prog.hs:6:13-31 Possible fix: add (RealFrac a) to the context of the type signature for roundTo2 :: Num a => a -> Float In the first argument of \`(/)', namely \`truncate (x * 100)' In the expression: truncate (x * 100) / 100 In an equation for `roundTo2': roundTo2 x = truncate (x * 100) / 100
Понимаю что проблема где-то в типах, но не понимаю, как эту проблему решить


Ответ

Используйте функцию printf из модуля Text.Printf.
import Text.Printf
main :: IO () main = do let x = 1.7 printf "%.2f
" ((x + 1) ^ 2 + 3 * (x + 1))

Комментариев нет:

Отправить комментарий