リストモナドと沢山のbind

また蟻本を読んでた。部分和問題という「数のリストと、目指す数が与えられて、数のリストから数を0個か1個ずつ選んで、その総和を目指す数にできるか?」という問題を解いていて、「あ!これって先のくじびきと同じ問題だ!」となったのであった。

くじびきは「数がいくらか与えられて、その数たちを重複を許して4つ選んで、その総和を目指す数にできるか?」という問題で、素朴にはこんな感じになる。

で、書こうと思ったのだが、くじびきなら「4つ」って決まっていたが、今回はいくつ数字が飛んでくるか分からない。「a <- [0, 1]」で、「1を取るか取らないか」という不定性を表現するつもりだったのに書けないじゃないかと思った。が、よく考えたら「リストのなかのモナド値をモナド値としてのリストにする」という関数があったなと思って、調べたらsequenceだった。というわけで、そのコードがこちら。

これで、数のリストが[1, 2, 3]とあったらそれを[[0,1],[0,2],[0,3]]と、取るか取らないかの不定性をそれぞれ持たせて、sequenceでうまくbindできた。

たしかに色んな本にaにsequenceを使う例はあったんだけど、こういう意味があるということに気付いてうれしい。