fugafuga.write

日々のログ

Haskell で Fizzbuzz

Haskell の練習のため、Fizzbuzzを書いた。最初本当に何も書けなくてびっくりした。

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

実行結果

*Main> fizzbuzz 16
["1","2","Fizz","4","Buzz","Fizz","7","8","Fizz","Buzz","11","Fizz","13","14","FizzBuzz","16"]

思考過程

  1. まず、標準出力に表示するのが無理なところで詰まる
  2. 結果をリストに格納していくことにする
  3. リスト内に Int, String が混在できないので詰まる
  4. 調べると show を使えば数字->文字列はなんとかなると判明する
  5. fizzbuzz [1..x] などと書き、わけがわからず手が止まる
  6. 処理過程の結果リストを保存しておかないといけない...などと考えてしまい詰まる
  7. H本の内包表記、畳込みなどを読み返す
  8. 再帰で表現しなければいけないことに気づく
  9. "FizzBuzz"が"Fizz"になってしまう問題でハマる
  10. ガードの条件の順番が原因と判明
  11. 完成

所感

あまりに書けなさすぎて本当につらかったが、動いた瞬間は感動があった。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

  • 作者: MiranLipovaca
  • 出版社/メーカー: オーム社
  • 発売日: 2017/07/14
  • メディア: Kindle版
  • 購入: 4人 クリック: 9回
  • この商品を含むブログを見る