Я пытаюсь создать небольшой модуль для выполнения десятичных вычислений.Число сохраняется как целочисленный mantisse со значением точности, заданным в int:
data APNum =
{ getMantisse :: Integer
, getPrecision :: Int }
Например:
APNum 123 0 -> 123
APNum 123 1 -> 1.23
APNum 123 2 -> 12.3
...
(отрицательная точность не допускается).
Теперь я написал эту функцию, которая автоматически настраивает точность, удаляя как можно больше конечных нулей:
autoPrecision :: APNum -> APNum
autoPrecision x@(APNum m p) = if p > maxPrecision
then autoPrecision $ setPrecision x maxPrecision
else autoPrecision' m p where
autoPrecision' m p = let (m',r) = m `divMod` 10 in
if r /= 0 || p <= 0 then APNum m p else autoPrecision' m' (pred p)
(MaxPrecision и setPrecision, я думаю, очевидны).
проблема в том, что этот фрагмент имеет очень плохую производительность, особенно n чисел с более чем 10000 цифрами.Есть ли простые оптимизации?