do記法

こちらのブログより引用した。
http://blog.netswitch.jp/2008/02/19/haskell-do-notation

test = do
    x <- [1, 2]
    y <- [1, 2]
    return [x, y]

test = [1, 2] >>= (\x -> [1, 2] >>= (\y -> return [x, y]))

実行結果

Main> test
[[1,1],[1,2],[2,1],[2,2]]

次のようなものを書いてみた。

testDo1 = do
  x <- [1,2]
  y <- [3,4]
  fun x y
    where fun x y = [x,y]

testDo2 = do
  x <- [1,2]
  y <- [3,4]
  fun x y
    where fun x y = [[x,y]]

実行結果

Main> testDo1
[1,3,1,4,2,3,2,4]
Main> testDo2
[[1,3],[1,4],[2,3],[2,4]]

今の自分にdo記法とかモナドはよくわからない。