-packSnafu :: Int -> [Int] -> String
-packSnafu 0 [] = ""
-packSnafu carry [] = [snafuRep carry]
-packSnafu carry (d:ds)
- | d' <= 2 = ((snafuRep d') : (packSnafu 0 ds))
- | otherwise = ((snafuRep (d' - 5)) : (packSnafu 1 ds))
+packSnafu :: [Int] -> String
+packSnafu = snd . foldl' packSnafuDigit (0, "")
+
+packSnafuDigit :: (Int, String) -> Int -> (Int, String)
+packSnafuDigit (carry, acc) d
+ | d' <= 2 = (0, (snafuRep d') : acc)
+ | otherwise = (1, (snafuRep (d' - 5) : acc))