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