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