リストの直積(デカルト積、カルテシアン)を内包表記→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]
こうやってみると通常の関数型だ…あたりまえだけど。
やっぱ内包表記ってすっきりした表現だな。