Недавно начал пробовать 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))
Комментариев нет:
Отправить комментарий