「これなーんだ」解答編

今日のお絵描き「これなーんだ」 - 西尾泰和のはてなダイアリーの答え

問題は下の絵の

  • 中心が黒い正方形は何か
  • 中心の白い正方形は何か
  • >みたいなものは何か
  • +みたいなものは何か

というものだった。

これはHaskellを学んだことがある人なら一回はけつまずいたことのあるアレだ

  • 上の三行はモナド
    • 1. (return x) >>= f == f x
    • 2. m >>= return == m
    • 3. (m >>= f) >>= g == m >>= (\x -> f x >>= g)
  • 中心の黒い正方形はモナド (Monad m) => m a
  • 中心の白い正方形(黒丸を入れると中心の黒い正方形になる)は、なんらかの引数を取ってモナドを返す関数 (Monad m) => a -> m b
    • 「飾りのない白い正方形」は return :: (Monad m) => a -> m a
  • >みたいなものは (>>=) :: (Monad m) => m a -> (a -> m b) -> m b
    • 左にモナド(中黒四角)、右にモナドを返す関数(中白四角)がくっつく
  • 先頭の正方形に黒丸がついていて非対称なのでわかりにくいけど、取り除いてけばようするに 1 * x = x, x * 1 = x, (x * y) * z = x * (y * z) と同じ構造
  • 三行目の右辺だけは中心の白い四角が>>=の左辺に来ているけど、これは(f x >>= g)というモナドからxという黒丸を取り除いて「xを入れたら(f x >>= g)になる絵」なので \x -> f x >>= g ね。一見(f >>= g)みたいに見えるけど。
  • 下の三行はMonadPlusの満たす法則
    • 1. mzero >>= f == mzero
    • 2. m >>= (\x -> mzero) == mzero
    • 3. mzero `mplus` m == m `mplus` mzero == m
  • 黒四角はmzero
  • +みたいなものはmplus
  • 黒四角から黒丸を取り除いたものは「黒四角を入れるとmzeroになる絵」なので \x -> mzero
  • これも黒丸を取り除いてみると要するに, 0 * x = 0, x * 0 = 0, x + 0 = 0 + x = x と同じ構造ということ