Haskellの(>>=)におけるモナド則の適用について
https://ja.wikibooks.org/wiki/Haskell/%E5%9C%8F%E8%AB%96
にfmap
とjoin
を使ったモナド則としてjoin . fmap (fmap f) = fmap f . join
というものがあります。
ここで(>>=)
の定義はx >>= f = join (fmap f x)
なので、
(>>=)
を使った計算に対してm >>= f >>= g = join . join . fmap (fmap g) . fmap f $ m
という変換ができることになると思います。つまりjoinを後からまとめて行うという変換です。
これは(>>=)
をいくつ繋げても同じように変換可能ですが、そもそもこの形のモナド則をf :: a -> m b
のような関数に適用していいのでしょうか?
説明での前提はf :: a -> b
の関数のようですが。
追記
m >>= f = join . fmap f $ m
をm
からの射をとして考えるのではなく、join $ fmap f m
つまりjoin
をfmap f m
からの射として考えれば、自然に可換図が作れました。