Другая идея, похожая на luqui's .Большинство моих проблем с fromIntegral
связаны с необходимостью деления Int
на Double
или Double
на Int
.Таким образом, этот (/.)
позволяет разделить любые два типа Real
, не обязательно одинаковые, и не обязательно Integral
типы, как в решении Люки:
(/.) :: (Real a, Real b, Fractional c) => a -> b -> c
(/.) x y = fromRational $ (toRational x) / (toRational y)
Пример:
ghci> let (a,b,c) = (2::Int, 3::Double, 5::Int)
ghci> (b/.a, c/.a, a/.c)
(1.5,2.5,0.4)
Это работает для любых двух Real
с, но я подозреваю, что рациональное деление и преобразование в / из Rational
не очень эффективно.
Теперь ваш пример становится:
roundDouble :: Double -> Int -> Double
roundDouble x acc = (round $ x * 10 ^ acc) /. (10 ^ acc)