Haskell モナド
Monad(モナド)
モナドがあることによって、例えばdo構文による手続き型プログラミングができる
IOモナドが標準入力、標準出力、ファイル入出力のようなIO部分のモナド 最近は下記のプロポーザルにしたがって各モナドの定義の置き換えが進んでいる
モナド則
code:memo.hs
1. return x >>= f = f x
2. m >>= return = m
3. (m >>= f) >>= g = m >>= (\x -> f x >>= g)
1. return xした結果をfで合成(>>=)した結果は、f xを実行した結果に等しい
2. モナドmをreturnで合成(>>=)した結果は変わらない
3.
数学っぽく書くと以下
圏$ C 、モナド$ M : C \to C と射$ f : A \to B (A,B \in C) があったとき、モナド則は以下のようになる。
1. $ \mathrm{join} \circ M(\mathrm{join}) = \mathrm{join} \circ \mathrm{join}
2. $ \mathrm{join} \circ M(\mathrm{unit}) = \mathrm{join} \circ \mathrm{unit} = \mathrm{id}
3. $ \mathrm{unit} \circ f = M(f) \circ \mathrm{unit}
4. $ \mathrm{join} \circ M(M(f)) = M(f) \circ \mathrm{join}
上記をHaskellのコードに直すと以下。
code:haskell
-- 1
join . fmap join = join . join
-- 2
join . fmap return = join . return = id
-- 3
return . f = fmap f . return
-- 4
join . fmap (fmap f) = fmap f . join
今のモナドの定義
確認用
Q. モナドとは
Q. return
Q. >>=
関連
参考
メモ