リストの直積(デカルト積、カルテシアン)を内包表記→do記法→モナド→concatMapの形で表してみる。

リストの直積(デカルト積、カルテシアン)を内包表記→do記法→モナド→concatMapの形で表してみる。


モナドとdoが同じなのがわかって実験

内包表記

[[x,y] | x <- [1,2] , y <- [3,4]]

do記法

returnが入っているところで若干 モナドを意識させる

do {x <- [1,2] ; y <- [3,4] ; return [x,y]}

retrunを消す

do {x <- [1,2] ; y <- [3,4] ; [[x,y]]}

バインド(>>=)

[1,2] >>= \x -> [3,4] >>= \y -> [[x,y]]

わかりやすく結合を括弧で表す

[1,2] >>= (\x -> [3,4] >>= (\y -> [[x,y]]))

バインド(=<<)

>>= の場合と違って括弧は外せない(この辺がおもしろい)

(\x -> (\y -> [[x,y]]) =<< [3,4]) =<< [1,2]

concatMapに戻す

バッククォートで中置化すると =<< と同じ並びになる

(\x -> (\y -> [[x,y]]) `concatMap` [3,4]) `concatMap` [1,2]

普通に戻す

concatMap (\x -> concatMap (\y -> [[x,y]]) [3,4]) [1,2]


こうやってみると通常の関数型だ…あたりまえだけど。

やっぱ内包表記ってすっきりした表現だな。