我希望能够定义一个类型(例如my_type),该类型可以标识具有字符串作为键的哈希表并映射到整数值。
所以,我尝试了
# type my_type = (string, int) Hashtbl.t;;
但是,当我尝试
# let a = Hashtbl.create 100;;
val a : ('_a, '_b) Hashtbl.t = <abstr>
# Hashtbl.add a "A" 12;;
- : unit = ()
# a;;
- : (string, int) Hashtbl.t = <abstr>
最后一行显示(string,int)Hashtbl.t = abstr而不是my_type。我如何确保它使哈希表的类型为my_type?
最佳答案
声明类型同义词并在精确的情况下期望编译器使用一个表达式或另一个表达式是没有意义的:由于它们是相等的类型,因此编译器将使用其中一个,而您对此几乎没有控制。
如果要强制类型抽象,以免将my_type
类型与任何其他(string, int) Hashtbl.t
混合使用,则应定义一个带有构造函数的新类型,以标记区别:
type my_type = Tbl of (string, int) Hashtbl.t
let a = Tbl (Hashtbl.create 100)
let add (Tbl t) k v = Hashtbl.add t k v
您可能想要这样做(并在需要使用
my_type
函数之一的情况下,需要通过显式模式匹配将Hashtbl
的所有值转换为哈希表的成本),或者您可能只想操作类型同义词,但在在后一种情况下,您不应期望编译器输出报告任何特定类型。