30629


<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`からの射として考えれば、自然に可換図が作れました。


CC BY-SA 3.0
2016-11-24T01:24:55.203
30625
2016-11-30T05:32:24.060
2016-11-30T05:32:24.060
19691
19691
question
haskell
Haskellの(>>=)におけるモナド則の適用について


端的にいうと、逆で、モナド則を満たすように、 f を実装してください、そうすれば、 (>>=) や do 記法などで問題なく使えるよ、ということです。


CC BY-SA 3.0
2016-11-24T02:20:10.550
30629
2016-11-24T02:33:44.073
2016-11-24T02:33:44.073
754
754
30625
answer