-- モナド則の1つとdo記法について plus x = Just (x + 1) func x y z = x + y + z f1 n = do p1 <- plus n p2 <- plus p1 p3 <- plus p2 return (func p1 p2 p3) -- do記法の規則によれば、 -- do e1; e2 = e1 >> e2 -- do p <- e1; e2 = e1 >>= \p -> e2 -- らしいので、f1は次のf2と同じ f2 n = plus n >>= \p1 -> plus p1 >>= \p2 -> plus p2 >>= \p3 -> return (func p1 p2 p3) -- 上記が実行できるということは、次のように解釈されているらしい。 f3 n = plus n >>= (\p1 -> plus p1 >>= (\p2 -> plus p2 >>= (\p3 -> return (func p1 p2 p3)))) -- モナド則の1つは次のような結合法則のことだといえそうだ f4 n = do p1 <- (Just n); p2 <- plus p1; plus p2 f5 n = Just n >>= (\p1 -> plus p1 >>= \p2 -> plus p2) f6 n = Just n >>= (\p1 -> plus p1 >>= plus) f7 n = (Just n >>= \p1 -> plus p1) >>= plus f8 n = (Just n >>= plus) >>= plus -- f4 -> f5 -> f6、f7 -> f8 は単に式を変形しただけなので、 -- f4 と f8 が同じであるためには、f6 と f7 が同じである必要がある。 -- これがモナド則の1つということなのだろう。