Вам необходимо понять разницу между, например, «списком строк» и «набором строк», который вы хотите построить.
Для списков типом является «список», потому что вам не нужно ничего знать о содержимом списка, чтобы построить список. Для набора вам нужен доступ по времени log (N), а для этого вы хотите организовать набор в зависимости от порядка элементов. Итак, вы должны быть в состоянии сравнить их. OCaml предоставляет функцию сравнения по умолчанию (Pervasives.compare), но эта функция не всегда самая лучшая: ее дорого использовать (например, для целых чисел), и она не работает постоянно (она использует лексикографический порядок на структура значения, это не всегда тот порядок, который вы хотите).
В OCaml, когда тип зависит от значения, которое является случаем «набора», но также может быть и «отсортированным списком», вам нужно использовать функтор для определения типа, и для примените функтор, чтобы получить новый тип.
Вот что делает для вас этот код:
module StringSet = Set.Make (String)
эквивалентно:
module StringSet = Set.Make(struct
type t = string
let compare = compare
end)
где «let Compare = Compare» означает, что функция сравнения является функцией по умолчанию (второе сравнение относится к Pervasives.compare). Вместо этого вы можете использовать непосредственно «String», поскольку модули String уже содержат «type t = string» и «let compare = compare».