Hello List

I would like the following feature, and I'm not enough of an expert in module-fu to know if something like this is doable.

Suppose I have a module signature of

module type Monad = sig
  type 'a m
  val return : 'a -> 'a m
  val (>>=) : 'a m -> ('a -> 'b m) -> 'b m
  val (>>) : 'a m -> 'b m -> 'b m
end

I would like to have a default implementation for (>>), since a simple default implementation is

let (>>) m f = m >>= fun _ -> f

Alternatively, I would like to include this from some DefaultMonad module, but have the (>>=) referred to in the function be my newly defined (>>=) implementation (ie. late binding). Is there currently any way to do this? If not, would there be a way to implement a partial default implementation built into or associated with a module signature? Something like

module type Monad = sig... default struct... end

Haskell has this available as part of the semantics of their typeclass system, and I think it would be really handy to have (if there isn't already a way to do it currently).

-Yotam