Monad Laws

とりあえずメモだけ…。

map :: (a -> b) -> (M a -> M b)
map fm = m * λa.unit (f a)

join :: M (M a) -> M a
join z = z * λm.m
map id = id
map (f . g) = map f . map g

map f . unit = unit . f
map f . join = join . map (map f)

join . unit = id
join . map unit = id
join . map join = join . join

m * k = join (map k m)

unit, join, map でモナドは定義できる。いつもの3つのモナド則は、これら7つの法則(m * k = join (map k m) 以外)で置き換えられる。