При альтернативном ответе, в частности, потому что вы делаете рекурсивную сумму (основание 10), а по умолчанию show
экземпляр - это основание 10, вы можете совершать обходы через строки и красиво писать с шаблоном представления,
{-# LANGUAGE ViewPatterns #-}
digitSum :: Int -> Int
digitSum x@(show -> (_:"")) = x
digitSum (show -> cs) = digitSum $ sum . map ( read . (:[]) ) $ cs
Если строковое представление представляет собой любой отдельный символ (т. Е. 0 <= x <= 9
), тогда просто верните x
, в противном случае выполните рекурсивное вычисление суммы целых чисел в строковом представлении.
Вы все еще можете красиво использовать шаблоны представления (imo) без округления, но для этого требуется вспомогательная функция для выражения целого числа в виде списка его цифр,
import Data.List (unfoldr)
import Data.Tuple (swap)
digitList :: (Integral a) => a -> [a]
digitList 0 = [0]
digitList n = unfoldr f n
where f 0 = Nothing
f i = Just . swap $ i `divMod` 10
digitSum' :: (Integral a) => a -> a
digitSum' (digitList -> x:[]) = x
digitSum' (digitList -> xs) = digitSum' $ sum xs