# Module type Monad_intf.Basic

    module type Basic = sig .. end

    type 'a t

    val bind : 'a t ->
           ('a -> 'b t) -> 'b t

    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`)

    val map : [ `Custom of 'a t -> f:('a -> 'b) -> 'b t
           | `Define_using_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.