Всё-таки с хорошими целочисленными логарифмами быстрее:
numDigits1 :: (Integral t) => t -> t
numDigits1 0 = 1
numDigits1 n = [ k + 1 | k <- [0..n], 10^k <= n && n < 10^(k+1) ] !! 0
myLogBase :: (Integral a, Num t) => a -> a -> t
myLogBase b n = if n < b then 0 else iter b n 0
where iter b n i = if (n `div` b) < b
then i + 1
else iter b (n `div` b) (i + 1)
numDigits2 :: (Integral t) => t -> t
numDigits2 0 = 1
numDigits2 n = truncate (myLogBase 10 n) + 1
numDigits1 (1000^1000) => 3001
numDigits2 (1000^1000) => 3001
numDigits1 (1000^10000) => не стал дожидаться
numDigits2 (1000^10000) => 30001