-3進数への変換

30分プログラム、その776。anarchy golf - Negatenaryにインスパイアされて、-3進数への変換をやってみました。
基数が負の変換はやったことがなかったので、わりと苦戦しました。各桁が必ず正の数になるようにするのがむずい!

使い方

*Main> negatenary (-60)
"2020"

ソースコード

negatenary :: Integral a =>  a ->  String

negQuotRem x y =
    let (q,r) = x `quotRem`  y
    in if r < 0 then
           (q+1, r-y)
       else
           (q,r)

negatenary 0 = ""
negatenary n = negatenary q ++ show r
    where (q,r) = n `negQuotRem` (-3)

main = mapM_ (putStrLn.negatenary)  [-60..182]