do 表記は、 の単なる構文糖衣です>>=
。次のようなコード
do x <- a
b -- b is an expression possibly involving x
脱糖される
a >>= \x -> b
CT でモナドを研究している場合、モナドが 2 つの自然な変換を持つファンクターとして定義されていることに気付くでしょう。
unit :: a -> m a -- also known as η
join :: m (m a) -> m a -- also known as μ
Haskell が定義している間
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
どちらのプレゼンテーションも同等です。確かに、unit
とreturn
はまったく同じものです。代わりに、次join
のように表現できます。(>>=)
join x = x >>= id
逆もまた同様で、(>>=)
で表すことができますjoin
。
x >>= f = join (fmap f x)
fmap
上記はa -> m b
とm a
を返すことm (m b)
に注意してm b
くださいjoin
。