FizzBuzz 問題が Twitter で話題になっていたので Haskell で書いてみた

震源地: http://d.hatena.ne.jp/JunichiIto/20111007/1317976730


なんか TwitterFizzBuzz が話題になってたんですが,ふと
「そういや Haskell の使いはじめの頃,練習がてら FizzBuzz を書こうとして苦戦してたなぁ」
と思い出したので,今なら楽に書けるかも,と思い,ちょいと書いてみることにしました.

追記( 23:45, 10/15 ): otherwise を間違って使っていたのを _ に修正 http://d.hatena.ne.jp/gintenlabo/20111015/1318689620

import System

isMultOf :: Integral a => a -> a -> Bool
x `isMultOf` n = ( x `rem` n == 0 )

fizzBuzz :: Integral a => a -> String
fizzBuzz n = fizzBuzz' ( n `isMultOf` 3 ) ( n `isMultOf` 5 ) where
  fizzBuzz' False False = show n
  fizzBuzz' True  False = "Fizz"
  fizzBuzz' False True  = "Buzz"
  fizzBuzz' True  True  = "FizzBuzz"

main = do
  args <- System.getArgs
  
  let n = case args of
            []  -> 30  -- Ideone にうpするので無引数にも対応
            [x] -> read x
            _   -> error "Invalid Program Option"
  
  mapM_ putStrLn $ map fizzBuzz [1..n]

http://ideone.com/TYyXf


所要時間は10分くらい.
…うん,何の捻りもないコードだ.


しかし, Haskell を使いはじめの頃は,こんなコードでも苦戦したわけで,
なんだかんだで FizzBuzz 問題を解かせるのは,実力を測るのに有用なのかもしれません.
特に Haskell みたいな言語の場合には,なんとなく知ってても,実際にコードを書いたことのない人って意外と多いですし.