All of these are the same: [ (x,y) | x <- [1..5], y <- "abcd" ] do x <- [1..5] y <- "abcd" return (x,y) do { x <- [1..5] ; y <- "abcd"; return (x,y) } [1..5] >>= \x -> "abcd" >>= \y -> return (x,y) concatMap (\x -> concatMap (\y -> [(x,y)]) "abcd") [1..5] concat (map (\x -> concat (map (\y -> [(x,y)]) "abcd")) [1..5]) concat (map (\x-> concat (map (\y -> [(x,y)]) "abcd")) [1..5])