M
is meant to be used in combination with OCaml applicative functor types:
type string_set = Set.M(String).t
which stands for:
type string_set = (String.t, String.comparator_witness) Set.t
The point is that Set.M(String).t
supports deriving, whereas the second syntax
doesn't (because there is no such thing as, say, String.sexp_of_comparator_witness,
instead you would want to pass the comparator directly).
Elt : sig ... end