ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

リストモナド

ふつうのHaskellプログラミング p270

とりあえず本書より引用

リストモナドの典型的な用途として、経路探索が挙げられます。経路探索は将棋や囲碁をプログラムで解くときに必要です。例えば将棋では最初に銀を動かすか、それとも歩を動かすか、打てる手がたくさんあります。その「たくさん×たくさん×たくさん×・・・・・・」の手のうちから、自分が打つ手を発見するのが将棋での経路探索です。
リストモナドは、このような問題に使うとぴったりはまります。まず「次に打てる手」を求める関数を用意しておいて、それを(>>=)で連結してやるのです。

とのこと。
アルゴリズムをAndでつなぐイメージか?よく分からん。
っていうか、モナド自体良く分からん。
が、とりあえず動くサンプルを書いてみる。

main = print $ concat $ return [1,2,3] >>= plus >>= mult

plus :: [Int] -> [[Int]]
plus x = [map (+1) x]

mult :: [Int] -> [[Int]]
mult x = [map (*2) x]

リストの値に1を足す関数と、リストの値に2をかける関数を、モナドっぽくつなげてみました。
結果はこう。

[4,6,8]

一応動いた。これが何の役に立つかはイマイチ分からない。