x :: Int
f :: Int -> Maybe Int
g :: Int -> Maybe Int
-- Task: evaluate g (f x) and abstract out Maybe.
case (f x) of
Nothing -> Nothing
Just y -> case (g y) of
Nothing -> Nothing
Just z -> z
-- equiv to
f x >>= \y ->
g y >>= \z ->
return z
-- equiv to
do y <- f x
z <- g y
return z
-- equiv to
y x >>= g