Balanced number checking
Here my thoughts on your solution. But I'm also learning Haskell right now, so I'm not an expert..

You don't need the data type. You can use base 10 logarithm to get the number of digits. Like this:

(floor $ logBase 10 $ fromIntegral n) + 1


I like the fact that digs is tail recursive. It looks simpler without the data type:

digits :: Int -&gt; [Int]
digits = digits_tr []
    where
        digits_tr :: [Int] -&gt; Int -&gt; [Int]
        digits_tr l 0 = l
        digits_tr l n = digits_tr (n `mod` 10 : l) (n `div` 10)


Why does balancedNum give a string? A boolean would be more natural.
If you want to handle errors, why not use Maybe instead of error? Like in balancedNum :: Int -&gt; Maybe Bool. Anyway according to the problem description you wouldn't need it: a negative number is just not balanced, so the function should just give False back.

Here is my solution:

balanced :: Int -&gt; Bool
balanced n
    | n &gt;= 0 = (sum $ take middle $ digits n) == (sum $ take middle $ reverse $ digits n)
    | otherwise = False
    where
        len = (floor $ logBase 10 $ fromIntegral n) + 1
        middle = if len `mod` 2 == 0 then len `div` 2 - 1 else len `div` 2