エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

「リストのリストにsequenceを適用すると直積が得られる」のはなぜか考える

教えてくれることを期待して思考停止しているようではダメダメなので、理解できるところまで考えてみる。

基本に立ち返ると、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で直積ができるのは理解できる(この結果が積み重なっていくのだから)。


でも、なんでこういう結果になるんだろう?