2012-01-22 7 views
6

Có thể lưu trữ các loại khác nhau trong cùng một Hashtable (Hashtbl) trong Ocaml không? Các hashtables có thực sự bị hạn chế chỉ với một loại không?Hashtables trong ocaml

Trả lời

22

Có, mục nhập bảng băm được giới hạn ở một loại cho mỗi bảng. Đây thực sự là một câu hỏi về hệ thống loại OCaml chứ không phải về các bảng băm. Nếu nó có vẻ kỳ quặc để yêu cầu những thứ phải cùng loại trong một bảng băm, làm thế nào về trong một danh sách?

Không biết vấn đề bạn đang giải quyết, thật khó để biết nên đề xuất điều gì. Tuy nhiên, một điều phổ biến để làm là tạo ra một loại đại số mà có một biến thể cho mỗi loại bạn đang làm việc với:

type alg = A of int | B of float 

Một giá trị của kiểu (string, alg) Hashtbl.t sẽ lưu trữ ints và nổi, sử dụng một chuỗi làm khóa tra cứu.

# let ht = Hashtbl.create 44;; 
val ht : ('_a, '_b) Hashtbl.t = <abstr> 
# Hashtbl.add ht "yes" (A 3);; 
- : unit =() 
# Hashtbl.add ht "no" (B 1.7);; 
- : unit =() 
# ht;; 
- : (string, alg) Hashtbl.t = <abstr> 
# Hashtbl.find ht "yes";; 
- : alg = A 3 

Sau khi bạn quen với việc nhập OCaml linh hoạt và mạnh mẽ, thật khó để quay lại hệ thống mà không có nó.