FizzBuzz
Haskell で FizzBuzz 問題を解こう。Haskell のことはまだ全然理解していないので、どうやって書いたらよいのか見当が付かない。とりあえず必要と思うことを挙げてみる。
- 繰り返し
- 剰余
- 分岐
繰り返し
Haskell には繰り返しの構文はないらしい。繰り返しは再帰を使えと。ちょっとカルチャーショック。1 から 100 までのカウントは 1 から 100 までのリストを作成して、各要素を順に処理していくようにすればいいのかな。
剰余
mod 関数を使う。よく使われている % ではなかったが、特段珍しいわけでもない。No カルチャーショック。
分岐
分岐は 4 つの書き方があるようだ。どの書き方がどのような場合に有効/有効でないかはまだ不明。
- 引数のパターンマッチング
- guard
- if-then-else
- case-of
ここまでのまとめ
繰り返しの仕方がまだわからないので、それ以外の部分をまとめるとこんな感じ。
fizzbuzz n | (mod n 15) == 0 = "FizzBuzz" | (mod n 5) == 0 = "Buzz" | (mod n 3) == 0 = "Fizz" | otherwise = n
1 から 100 までのリストは
[1..100]
と書けるのはいいとして、それをどうやって再帰させようか?ということで調べてみた。で、次ぎようにしてみた。
main = do print $ map fizzbuzz [1..100]
まとめ
でき上がったのが以下のコード。
fizzbuzz n | (mod n 15) == 0 = "FizzBuzz" | (mod n 5) == 0 = "Buzz" | (mod n 3) == 0 = "Fizz" | otherwise = show n main = do print $ map fizzbuzz [1..100]
一応それなりに表示されるようにはなったが、map はリストを返すので出力結果がリストの内容をダンプしたものになっている。一行ずつ表示されるようにしたい。とりあえず、今回はここまで。