FizzBuzz で学ぶ

HaskellFizzBuzz

recFizzBuzz :: Int -> [String]
recFizzBuzz = reverse.recFizzBuzz'

recFizzBuzz' :: Int -> [String]
recFizzBuzz' 0 = []
recFizzBuzz' n | n `mod` 15 == 0  = "FizzBuzz":recFizzBuzz' (n-1)
               | n `mod` 3  == 0  = "Fizz":recFizzBuzz' (n-1)
               | n `mod` 5  == 0  = "Buzz":recFizzBuzz' (n-1)
               |otherwise         = show n:recFizzBuzz' (n-1)

caseFizzBuzz' :: Int -> [String]
caseFizzBuzz' 0 = []
caseFizzBuzz' n = case [n `mod` 3 , n `mod` 5 ] of 
                    [0,0] -> "FizzBuzz":caseFizzBuzz' (n-1)
                    [0,_] -> "Fizz":caseFizzBuzz' (n-1)
                    [_,0] -> "Buzz":caseFizzBuzz' (n-1)
                    _     -> show n:caseFizzBuzz' (n-1)
  • map で
mapFizzBuzz :: Int -> [String]
mapFizzBuzz n = map caseFunc [1..n]

-- until で
-- 関数型!侵略ノススメ☆
-- http://d.hatena.ne.jp/tanakh/20101206#p1
untilFizzBuzz :: Int -> [String]
untilFizzBuzz n = reverse $ until  ( (>=n) . length) (\x->caseFunc ((length x)+1):x) []

-- http://haskell.g.hatena.ne.jp/udzura/20111006
caseFunc :: Int -> String
caseFunc n = case (n `mod` 3,n `mod` 5 ) of
               (0,0) -> "FizzBuzz"
               (0,_) -> "Fizz"
               (_,0) -> "Buzz"
               _     -> show n
-- http://www.willamette.edu/~fruehr/haskell/evolution.html
schemeFizzBuzz :: Int -> [String]
schemeFizzBuzz = (\(n) -> (reverse (schemeFizzBuzz' (n))))

schemeFizzBuzz' :: Int -> [String]
schemeFizzBuzz'  = 
 (let dec = (\(c)->((-) c 1))
    in (\(n) ->
      (if ((==) n 0)
        then ([])
        else (if ((==) (mod n 15) 0)
                then ((:) "FizzBuzz" (schemeFizzBuzz' (dec n)))
                else (if ((==) (mod n 5) 0) 
                         then ((:) "Buzz" (schemeFizzBuzz' (dec n)))
                         else (if ((==) (mod n 3) 0) 
                                  then ((:) "Fizz"
                                            (schemeFizzBuzz' (dec n)))
                                  else ((:) (show n) 
                                            (schemeFizzBuzz' (dec n)))))))))
  • zipWith で
-- http://d.hatena.ne.jp/takatoh/20070509/fizzbuzz
zipFizzBuzz n = take n $ zipWith (\x y -> if y=="" then x else y) 
                                 (map show [1..n]) 
                                 (zipWith (++) (cycle ["","","Fizz"]) (cycle ["","","","","Buzz"]))