module Main where import System.Environment fb :: Int -> String fb num | num `mod` 15 == 0 = "FizzBuzz" | num `mod` 3 == 0 = "Fizz" | num `mod` 5 == 0 = "Buzz" | otherwise = show num fizzbuzz :: Int -> [String] fizzbuzz num = map fb [1..num] main :: IO () main = do args <- getArgs mapM_ putStrLn (fizzbuzz $ read (args !! 0))
Erlangにもlists:map
やlists:seq
等有り、それらを使うのが行儀が良いのだろうが、FizzBuzz程度ならパターンマッチと再帰を使うのが拙速である。
追記20120828
パターンマッチと再帰を使う方法は、ついこの間書いたので([FizzBuzz #erlang http://c4se.hatenablog.com/entry/2012/06/29/222300 ])、真面目にlistsモジュールとlist内包表記を使う。
-module(fizzbuzz). -export([start/0]). %% 1> c(fizzbuzz). %% 2> fizzbuzz:start(). %% <0.54.0> %% 3> pid(0, 54, 0) ! 100. start() -> spawn(fun() -> loop() end). loop() -> receive N -> io:fwrite(fizzbuzz(N)), loop() end. fizzbuzz(N) -> lists:concat([fbitem(X) || X <- lists:seq(1, N)]). fbitem(N) when N rem 15 == 0 -> "FizzBuzz"; fbitem(N) when N rem 3 == 0 -> "Fizz"; fbitem(N) when N rem 5 == 0 -> "Buzz"; fbitem(N) -> N.