モナドメモ - 関数型言語におけるモナド

圏論においてモナドの定義に2つ方法があるのと同様に,関数型言語においても2つの定義がある.

モナド in 関数型言語

joinunitによる定義

あるデータ型M aがモナドであるとは,

unit :: a -> M a
join :: M (M a) -> M a
map  :: (a -> b) -> M a ->  M b

という関数に対し,

という性質を満たすことである.

bindによる定義

あるデータ型M aがモナドであるとは,

unit :: a -> M a
bind :: M a -> (a -> M b) -> M b

という関数に対し,

という性質を満たすことである.

互いの関係

とうぜんこれらは相互に変換しあう.

m `bind` k = join (map k m)

であり,

map f m = m `bind` λx. unit (f x)
join z = z `bind` id

である.

モナドと関数合成

モナドは関数合成に通常と異なる意味を与えたものである.実際に f @ g = λx . f x `bind` gと定義すると,unitをid関数として, a -> M bという関数(モナディック関数とよばれる)の世界において,演算子@は関数合成のように振舞う.