content: import Data.Char (chr, ord)
  import Numeric (showIntAtBase)
  
  -- The remainder and quotient of n/d, where the remainder is guaranteed to be
  -- non-negative.  The divisor, d, is assumed to be negative.
  quotRemP :: Integral a => a -> a -> (a, a)
  quotRemP n d = let (q, r) = quotRem n d
                 in if r < 0 then (q+1, r-d) else (q, r)
  
  -- Convert the number n to base b, where b is assumed to be less than zero.
  toNegBase :: Integral a => a -> a -> a
  toNegBase b n = let (q, r) = quotRemP n b
                  in if q == 0 then r else negate b * toNegBase b q + r
  
  -- Convert n to a string, where n is assumed to be a base b number, with b less
  -- than zero.
  showAtBase :: (Integral a, Show a) => a -> a -> String
  showAtBase b n = showIntAtBase (abs b) charOf n ""
    where charOf m | m < 10    = chr $ m + ord '0'
                   | m < 36    = chr $ m + ord 'a' - 10
                   | otherwise = '?'
  
  -- Print a number in base b, where b is assumed to be less than zero.
  printAtBase :: (Integral a, Show a) => a -> a -> IO ()
  printAtBase b = putStrLn . showAtBase b . toNegBase b
  
  main :: IO ()
  main = do
    printAtBase (-2)  10
    printAtBase (-3)  146
    printAtBase (-10) 15
    printAtBase (-16) 107
    printAtBase (-36) 41371458
  