Hashtable в Ocaml, где ключ является кортежем - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь создать таблицу разбора LL1 в ocaml. Мне бы хотелось, чтобы ключ был нетерминальным, кортеж input_symbol. Возможно ли это?

Я знаю, что вы можете сделать стек кортежей :

let (k : (string*string) Stack.t) = Stack.create ();;

Заранее спасибо !!

1 Ответ

0 голосов
/ 06 ноября 2018

Ключ хеш-таблицы в OCaml может иметь любой тип, который можно сравнить на равенство и можно хэшировать в целое число. «Ванильный» интерфейс использует встроенное полиморфное сравнение для сравнения на равенство и встроенную полиморфную хеш-функцию.

Встроенная функция полиморфного сравнения не работает для типов функций и для циклических значений.

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

Нетрудно создать хеш-таблицу с кортежами в качестве ключей:

# let my_table = Hashtbl.create 64;;
val my_table : ('_weak1, '_weak2) Hashtbl.t = <abstr>
# Hashtbl.add my_table (1, 2) "one two";;
- : unit = ()
# Hashtbl.add my_table (3, 4) "three four";;
- : unit = ()
# Hashtbl.find my_table (1, 2);;
- : string = "one two"
...