Я хочу использовать OCaml для создания наборов данных и сравнения между ними. Я видел документацию по типам модулей, например Set.OrderType
, Set.Make
и т. Д., Но я не могу понять, как инициализировать набор или иным образом использовать их.OCaml: Установить модули
ответ
Наборы определяются с использованием функториального интерфейса. Для любого данного типа вам необходимо создать модуль Set
для этого типа с помощью функции Set.Make
. Несчастный надзор над стандартными библиотеками заключается в том, что они не определяют экземпляры Set
для встроенных типов. В большинстве простых случаев достаточно использовать Pervasives.compare
. Вот определение, которое работает для int
:
module IntSet = Set.Make(
struct
let compare = Pervasives.compare
type t = int
end)
Модуль IntSet
будет реализовывать интерфейс Set.S
. Теперь вы можете работать на множествах с помощью IntSet
модуля:
let s = IntSet.empty ;;
let t = IntSet.add 1 s ;;
let u = IntSet.add 2 s ;;
let tu = IntSet.union t u ;;
Обратите внимание, что вы не должны явным образом определить структуру ввода для Set.Make
как OrderedType
; тип вывода сделает работу за вас. Кроме того, можно использовать следующее определение:
module IntOrder : Set.OrderedType = struct
type t = int
let compare = Pervasives.compare
end
module IntSet = Set.Make(IntOrder)
Это имеет то преимущество, что вы можете повторно использовать один и тот же модуль для создания экземпляра Map
:
module IntMap = Map.Make(IntOrder)
Вы потеряете некоторую типичность в использовании функторов, потому что тип элементов фиксирован. Например, вы не сможете определить функцию, которая принимает произвольный тип Set
и выполняет некоторую операцию над ним. (К счастью, модуль сам Set
объявляет много полезных операций на Set
с.)
В дополнении к ответу Криса, это может быть полезно, чтобы сказать, что некоторые стандартные библиотечные модули уже придерживаются OrderedType
подписи. Например, вы можете просто:
module StringSet = Set.Make(String) ;; (* sets of strings *)
module Int64Set = Set.Make(Int64) ;; (* sets of int64s *)
module StringSetSet = Set.Make(StringSet) ;; (* sets of sets of strings *)
И так далее.
Вот простой пример использования для StringSet
; помните, что множества функциональных структур данных, так что добавление нового элемента в наборе возвращает новый набор:
let set = List.fold_right StringSet.add ["foo";"bar";"baz"] StringSet.empty ;;
StringSet.mem "bar" set ;; (* returns true *)
StringSet.mem "zzz" set ;; (* returns false *)
- 1. Как установить модули OCaml?
- 2. модули OCaml и подписи
- 3. Модули OCaml/reason design
- 4. Unbound модули в OCaml
- 5. модули OCAML реализация
- 6. Модульные модули OCaml с pa_ounit
- 7. OCaml - Подписи, модули и типы
- 8. Как установить дополнительные модули-модули?
- 9. OCaml рекурсивные модули по единицам компиляции
- 10. OCaml: как использовать модули в Windows
- 11. Организация проектов OCaml: файлы и модули
- 12. Возвратите различные модули первого класса в OCaml
- 13. Установить тип списка OCaml
- 14. Jupyter: установить новые модули
- 15. Невозможно установить модули perl
- 16. Установить все NodeJS модули
- 17. Невозможно установить модули python
- 18. Как установить модули CPAN
- 19. Как установить corebuild в ocaml
- 20. Как правильно установить программу ocaml?
- 21. Ocaml: Установить текущий рабочий каталог?
- 22. новый набор инструментов: оригинальные модули F # или портированы из OCaml
- 23. Как импортировать и использовать новые модули в ocaml?
- 24. 2 OCaml модули с таким же именем (файл)
- 25. ocaml вложенные модули: реализация ml не соответствует интерфейсу cmi
- 26. Как сделать модули в соответствии с сигнатурами OCaml
- 27. Не связывайте все стандартные библиотечные модули при компиляции OCaml
- 28. установить модули python в azure
- 29. Принудительно установить модули npm вручную
- 30. Невозможно установить модули для anaconda
«вы не сможете определить функцию, которая принимает набор некоторого произвольного типа» вы могли бы, однако, выполните то же самое, определив функцию внутри функтора, которая принимает ваш конкретный модуль Set в качестве параметра. но использовать его, конечно, программисту пришлось бы сделать еще один модуль с этим функтором, поэтому он менее удобен. – newacct
Право. Это функторы полностью вниз. –