OCaml пустая глобальная переменная

Я хотел бы знать, как делают я определяю пустое! глобальная переменная типа Hashtbl в OCaml? Я не хочу использовать Hashtbl.create, потому что я не знаю его начального размера, и я не хочу предполагать начальный размер по причинам производительности.

В основном эта переменная Hashtbl будет assigjned реальный Hashtbl в функции, и затем эта переменная будет общими для другими функциями, таким образом, я не захочу раздавать его как аргумент все время следовательно, я хотел бы, чтобы это было глобально.

Спасибо,

Spasski

5
задан Spasski 29 December 2009 в 08:31
поделиться

2 ответа

То, что вы просите, возможно. Вы можете определить глобальную ссылку (это позволит вам назначить ее позже) на опцию хэш-таблицы (это позволит вам оставить ее неинициализированной вначале). Определение будет выглядеть следующим образом:

let hashtable = ref None

Инициализация будет:

hashtable := Some (Hashtbl.create n)

Чтобы использовать его, вам также нужно будет объяснить, что должно произойти, если вы еще не инициализировали его:

match !hashtable with 
  | None -> assert false
  | Some h -> frobnicate h

На практике, неинициализированные переменные противоречат философии OCaml и только усложнят вам жизнь. Я настоятельно рекомендую Вам не использовать этот подход. Двумя моими предложениями было бы:

  • Определить потерю производительности, вызванную созданием хэш-таблицы с угаданным размером. Накладные расходы могут быть намного меньше, чем вы думаете.

  • Просто передайте хэш-таблицу повсюду. Это единственный аргумент, который короче, чем ссылка на опцию...

  • Поместите вашу хэш-таблицу и функции, использующие ее, в класс.

5
ответ дан 13 December 2019 в 19:28
поделиться

Хэш-таблицы в OCaml растут по мере надобности, так что вы можете просто угадать сначала, например :

module A

let hash = Hashtbl.create 123;;

...

let exceed_hash () = 
         for i = 1 to 555 do 
               Hashtbl.add hash i (string_of_int i) 
         done;;

Хотя вы превышаете начальное число, но оно тоже будет работать бесперебойно, обратитесь к этому учебнику за дополнительной информацией http://www.ocaml-tutorial.org/hashtbl

6
ответ дан 13 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: