モナド

11.3 リストモナド


リストモナドも難しい。
分かったようでいて分からないもやもや感。
時間をかけて、考えてみる。

具体例で試してみる

いつものようにNonsenseな例を作ってみます。

{--
  階乗のリストを作成する。
  階乗のリストって何ていうんだろう?
--}
fact :: Int -> [Int]
fact 0 = []
fact x = x : (fact (x-1))

main = do print $ fact 10
          -- 階乗のリストの各項目に対してさらに階乗のリストを作る
          print $ fact 10 >>= fact
          print $ return 10 >>= fact >>= fact >>= fact


自分で作ってみると、何となく分かってきます。
外から見るとMaybeモナドと同じ構造になっていますね。
(>>=)とreturn。
まさしく演算をつないでいます。

分からないなりにまとめてみる

やっぱり、Monadは(>>=)とreturnなんですね。
今回再認識出来ました。
この二つの関数を使うことで、綺麗にコードを書くことが出来る。


…ということは使わなくても同じことを行うことは可能なわけですね。
ただ単に綺麗にコードを書くことが出来るだけ?
確かに上の例では

concatMap fact (fact 10)


とも書けるわけです。
う〜ん、理解まであと一歩!?


引き続き、IOモナドに進みます。