#!/usr/bin/env runhaskell

import Control.Monad (guard)

main :: IO ()
main = sequence_ $ do
  name <- ["vasya", "petya", "world"]
  entities <- if name == "vasya" then ["messages", "posts"] else ["messages"]
  count <- [1..5] :: [Integer]
  guard ((entities == "messages") || (count < 3))

  return $ do
    putStrLn $ "Hello, " ++ name
    putStrLn $ show count ++ " " ++ entities ++ " for you"

Вместо тысячи each

Уровень влженности?

Кого это ебет. Сегодня по работе писал тройной цикл с гвардами (используя next if ..., как завещал bbatsov), никакого сравнения ни в красоте, ни, если уж на то пошло, в читаемости.

Впрочем

#!/usr/bin/env runhaskell

import Control.Monad (guard)

main :: IO ()
main = sequence_ $
  ["vasya", "petya", "world"] >>= \name ->
    (if name == "vasya" then ["messages", "posts"] else ["messages"]) >>= \entities ->
      ([1..5] :: [Integer]) >>= \count ->
        guard ((entities == "messages") || (count < 3)) >>
        return (
          putStrLn ("Hello, " ++ name) >>
          putStrLn (show count ++ " " ++ entities ++ " for you")
        )

Без do-нотации уже не то, выглядит как код, который пришлось писать на руби. Жаль, в руби do-нотацию не внедрить нормально :(