Haskell で FizzBuzz

夜中にこつこつ Haskell を勉強しています。

初めての Haskell プログラムは FizzBuzz に挑戦。
ついループで考えてしまう。
うぉ、超難しい。

fizzBuzz :: Int -> [String] -> [String]
fizzBuzz 31 ss = ss
fizzBuzz n ss = do
    if n `mod` 3 == 0 && n `mod` 5 == 0
        then fizzBuzz (n + 1) ("FizzBuzz" : ss)
        else if n `mod` 3 == 0
            then fizzBuzz (n + 1) ("Fizz" : ss)
            else if n `mod` 5 == 0
                then fizzBuzz (n + 1) ("Buzz" : ss)
                else fizzBuzz (n + 1) (show n : ss)

printList :: [String] -> IO ()
printList [] = putStr "\n"
printList (s:ss) = do
    putStr (s ++ " ")
    printList ss

main = printList $ reverse $ fizzBuzz 1 []

とりあえずできたのがこれ。
実はこれよりももっとできの悪い FizzBuzz があるんだけど、それはまたの機会にでも紹介します。

この FizzBuzz はダサいので、Haskell をマスターしたらエレガントなのをアップしなおさないとなぁ。