Up
### Signature

val
return : 'a -> 'a t

The following identities ought to hold (for some value of =):

`return x >>= f = f x`

`t >>= fun x -> return x = t`

`(t >>= f) >>= g = t >>= fun x -> (f x >>= g)`

Note: `>>=`

is the infix notation for `bind`

)

The `map`

argument to `Monad.Make`

says how to implement the monad's `map`

function.
``Define_using_bind`

means to define `map t ~f = bind t (fun a -> return (f a))`

.
``Custom`

overrides the default implementation, presumably with something more
efficient.

Some other functions returned by `Monad.Make`

are defined in terms of `map`

, so
passing in a more efficient `map`

will improve their efficiency as well.