Set.choose
- псевдоним для Set.min_elt
; хотя может и не быть в будущем.
List.nth
наверняка будет отстой, если вам придется делать это очень часто.
Массив будет отлично работать, но если вам нужно добавить больше элементов или удалить элементы, это может стать кошмаром для бухгалтерии.
Взгляните на реализации списков произвольного доступа , которые имеют довольно оптимальное время для вставки, удаления, поиска и кардинала, не ограничиваясь массивами.
Когда я впервые столкнулся с этой проблемой, я расширил реализацию Set
и Map
, включив в нее random
и nth
. Чтобы расширить модуль, вам нужно заново реализовать структуру и добавить функции идентичности для преобразования между ними. Я написал новый модуль под названием XSet
со следующим шаблоном:
module Make (Ord : Set.OrderedType) =
struct
include Set.Make(Ord)
type impl = Empty | Node of impl * elt * impl * int
external impl_of_t : t -> impl = "%identity"
external t_of_impl : impl -> t = "%identity"
...
end
Вам придется использовать impl_of_t
и наоборот для вызова нормальных Set
функций или вызова ваших личных из переданных аргументов - то, что передается вашей функции, должно быть реализацией Set.Make
t
не impl
.