M
is meant to be used in combination with OCaml applicative functor types:
type string_to_int_table = int Hashtbl.M(String).t
which stands for:
type string_to_int_table = (String.t, int) Hashtbl.t
The point is that int Hashtbl.M(String).t
supports deriving, whereas the second
syntax doesn't (because t_of_sexp
doesn't know what comparison/hash function to
use).