lift . return = return lift (m >>= f) = lift m >>= (lift . f) 今まではなんとなくモナドの分配則で語るべき話かと思ってたんだけど、微妙に違うっぽい。具体的には、liftはモナド間の射(monad morphism)として定義されている。確かに、求められる法則を見るとreturnと(>>=)の構造を保持するような規則と読み取れる。 ところで、モナドは関手なので、その間の射であれば自然変換であるべきだ。liftも計算してみるときちんと自然変換になっている。f :: a -> bについて可換性を見てみる。 (lift . (fmap f)) mx = lift(fmap f mx) = lift(mx >>= (return . f)) -- fmapの定義 = lift mx >>= (lift . return . f) -- 法則