みどりねこ日記

よくわからないけど、頑張りますよ。

Haskellのモナド(10)

結合性のおかげで、仮にネストしたとしても>>=演算子が計算の順番のみに対して影響することが保証されます。例えば、下のコードも等価であることが保証されています。

bothGrandfathers p =
	(father p >>= father) >>=
		(\gf -> (mother p >>= father) >>=
			(\gm -> return (gf, gm)))

モノイドの場合、ラムダ式で表される (\x -> f x >>= g)となるので多少違って見えるかもしれませんが、この規則はモノイドの結合性と似たものです。これをもっとわかりやすく書くと、

(f >=> g) >=> h = f >=> (g >=> h)

となり、>=>はモナドの関数合成( . )と同じで、

(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
f >=> g = \x -> f x >>= g

と定義されています。
(>>)演算子の結合性は特別で、

(m >> n) >> o = m >> (n >> o)

となります。