Actually, do notation is hardly necessary, about the only thing it really saves on is refutable patterns.

do

a <- m

b <- f a

return (a+b)

m >>= \a ->

f a >>= \b ->

return (a+b)

A bit uglier, but not any more complex, in particular, the parens are not necessary so you do not have to deal with matching a bunch of them.

]]>

do

a

```
```

m >>= \a ->

f a >>= \b ->

return (a+b)

A bit uglier, but not any more complex, in particular, the parens are not necessary so you do not have to deal with matching a bunch of them.

]]>