-- comprehending list comprehensions

import Monad ( guard )

list1 =
  [ (x,y,z)
  | x <- [1..]
  , let y = [1..x]
  , z <- map (+1) y
  , 2*x>=z ]

list2 = do
  x <- [1..]
  let y = [1..x]
  z <- map (+1) y
  guard (2*x>=z)
  return (x,y,z)

list3 =
  [1..] >>= \x ->
  let y = [1..x] in
  map (+1) y >>= \z ->
  guard (2*x>=z) >>
  return (x,y,z)

test = take 100 list1 == take 100 list2 && take 100 list2 == take 100 list3
