Hi Yotam, The way I usually do this is by making a minimal required subset module type and then a default module that includes the overrides: module DefaultMonad(M : sig type 'a m val return : 'a -> 'a m val (>>=) : 'a m -> ('a -> 'b m) -> 'b m end) : Monad with type 'a m = 'a M.m = struct open M (* for >>= *) let (>>) m f = m >>= λ _ → f include M (* fill in the signature and possibly override above definition *) end Then you can pass your incomplete module (without >>) to DefaultMonad, which implements a default for you, which you can still override in a complete module. Regards, Pippijn