Hashtable индексируется на нескольких полях

В настоящее время я программирую модуль OCaml, определяя тип, соответствующий регистру ЦП. Интерфейс этого модуля следующий:

(*
 * Defines a type which represents a R3000 register.
 *)

type t =
|   R0                                      (* Always 0 *)
|   AT                                      (* Assembler temporary *)
|   V0 | V1                                 (* Subroutine return values *)
|   A0 | A1 | A2 | A3                       (* Subroutine arguments *)
|   T0 | T1 | T2 | T3 | T4 | T5 | T6 | T7   (* Temporary registers *)
|   S0 | S1 | S2 | S3 | S4 | S5 | S6 | S7   (* Register variables *)
|   T8 | T9                                 (* Temporary registers *)
|   K0 | K1                                 (* Reserved for kernels *)
|   GP | SP | FP                            (* Global/Stack/Frame pointer *)
|   RA                                      (* Return address *)

(*
 * Conversion from/to [|0, 31|].
 *)
val of_int : int -> t
val to_int : t -> int

(*
 * Conversion to string for display.
 *)
val of_string : string -> t
val to_string : t -> string

Однако я бы хотел, чтобы реализация была быстрой и не слишком повторяющейся. Например, я мог бы написать функцию of_int следующим образом:

let of_int = function
|    0 -> R0
|    1 -> AT
    (* ... *)

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

Первое решение, которое я нашел, было бы использовать препроцессор (Camlp4 или cpp) для генерации кода, который я хочу. Я считаю, что это излишне, но я бы использовал этот метод, если вы можетеПомоги мне с моей второй идеей.

Подумав немного, я подумал, что смогу сделать что-то вроде этого:

type regdescr = {
    reg : t ;
    name : string ;
    index : int
}

let regs =
    let htbl = Hashtbl.create 32 in
    let li = [ (* regdescr defs here *) ] in
    List.iter (Hashtbl.add htbl) li ;
    htbl

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

Извините за длинный вопрос, ответ на который может быть тривиальным :).

Ответы на вопрос(2)

Ваш ответ на вопрос