「Lisp脳」の謎に迫る - Schemeプログラマの発想をみて、Haskellだったらどう書くかを考えてみた。
基本はFizzBuzzの無限リストを生成してtakeすればよかろうと。
- FizzとBuzzは一定周期で現れるのでcycleで無限リストをつくる
- 二つを混ぜあわせた無限リストをつくる(zipWith)
- 空いてるところに数列を埋め込む
出来たのがこれ。
fizzbuzz = fizzbuzz' [1..] fbz
where
fizzbuzz' (x:xs) (y:ys) | y == "" = (show x):(fizzbuzz' xs ys)
| otherwise = y:(fizzbuzz' xs ys)
fbz = zipWith (++) (cycle ["","","Fizz"]) (cycle["","","","","Buzz"])
あとは好きなだけtakeする