Haskell で FizzBuzz ってみた

だいぶ前に書いたんだけど、すっかり忘れてたのでもっかい書いた。
[1..100] でもよかったかもしれない。

module Main where

import Control.Monad (forM_)

numsFrom    :: Integer -> [Integer]
numsFrom n   = n : numsFrom (n + 1)

isFizz      :: Integer -> Bool
isFizz n     = n `mod` 3 == 0

isBuzz      :: Integer -> Bool
isBuzz n     = n `mod` 5 == 0

isFizzBuzz  :: Integer -> Bool
isFizzBuzz n = (isFizz n) && (isBuzz n)

toFizzBuzz  :: Integer -> String
toFizzBuzz n | isFizzBuzz n = "FizzBuzz"
             | isFizz n     = "Fizz"
             | isBuzz n     = "Buzz"
             | otherwise    = show n

main        :: IO ()
main         =
  let fizzbuzz = map toFizzBuzz (take 100 (numsFrom 1))
  in
   forM_ fizzbuzz putStrLn