import Control.Monad
import Data.IORef
condIO :: [(IO Bool, IO ())] -> IO ()
condIO [] = return ()
condIO ((ioBool, ioAct):rest) = do
b <- ioBool
if b then ioAct else condIO rest
pure :: Monad m => a -> m a
pure = return
fizzBuzz :: IO ()
fizzBuzz = do -- unnecessary do; doesn't hurt if you don't grok monads though.
forM_ [1 .. 100] $ \i -> do
condIO [
(pure (i `mod` 15 == 0), do
putStrLn "FizzBuzz"
)
, (pure (i `mod` 3 == 0), do
putStrLn "Fizz"
)
, (pure (i `mod` 5 == 0), do
putStrLn "Buzz"
)
, (pure otherwise, do
print i
)
]
main = fizzBuzz