import Data.Bool (bool) fizzBuzz :: [String] fizzBuzz = let fb n k = cycle $ replicate (pred n) [] <> [k] in zipWith (flip . bool <*> null) (zipWith (<>) (fb 3 "fizz") (fb 5 "buzz")) (show <$> [1 ..]) main :: IO () main = mapM_ putStrLn $ take 100 fizzBuzz