教えてくれることを期待して思考停止しているようではダメダメなので、理解できるところまで考えてみる。
基本に立ち返ると、sequence
のソースは次のようになっているのがここからわかる。
sequence ms = foldr k (return []) ms where k m m' = do { x <- m; xs <- m'; return (x:xs) }
それほど難しいものではない。問題はk m m'
の部分。
MaybeモナドやIOモナドなら、何となく予想はつく。これをリスト(Listモナド)に適用するとどうなるかが問題。
Prelude> let k m m' = do { x <- m; xs <- m'; return (x:xs) } Prelude> k "01" ["0", "1"] ["00","01","10","11"]
この結果を見れば、sequence
で直積ができるのは理解できる(この結果が積み重なっていくのだから)。
でも、なんでこういう結果になるんだろう?