在OCAML3.11上编译代码,但不在4.01上编译

在OCAML3.11上编译代码,但不在4.01上编译,ocaml,Ocaml,我有以下代码在OCaml 3.11中编译得很好: module type T = sig type test val create : int -> test (* line 44 *) ... end ... type test = (string, clause list) Hashtbl.t let create = Hashtbl.create (* line 332 *) 但是,当我尝试用OCaml 4.01编译它时,它给出了以下错误: Error: Sign

我有以下代码在OCaml 3.11中编译得很好:

module type T =
sig
  type test
  val create : int -> test (* line 44 *)
  ...
end

...

type test = (string, clause list) Hashtbl.t

let create = Hashtbl.create (* line 332 *)
但是,当我尝试用OCaml 4.01编译它时,它给出了以下错误:

Error: Signature mismatch:
       ...
       Values do not match:
         val create : ?random:bool -> int -> ('a, 'b) Hashtbl.t
       is not included in
         val create : int -> theory
       File "test1.ml", line 44, characters 2-28: Expected declaration
       File "test1.ml", line 332, characters 6-12: Actual declaration
make[1]: *** [test1.cmo] Error 2
make: *** [byte-code] Error 2
OCAML4中发生了什么变化,以至于现在无法编译它?我相信它有一个非常简单的解释,但我仍在学习OCaml类型的内部工作原理。

当然!由于添加是一个可选参数,因此它将影响给函数添加别名的任何人(这将继承type,inc.可选参数)。您必须扩展create函数的参数才能解决此问题,如

let create i = Hashtbl.create i
事实上,应该注意的是,您只需要扩展一个参数就可以从推断的类型签名中删除可选参数,如

let create ?random1 ?random2 x y z = Hashtbl.create (x+y+z);;
(* ?random1:'a -> ?random2:'b -> int -> int -> int -> ('c, 'd) Hashtbl.t *)
let create7 = create 7;;
(* create7 : int -> int -> ('_a, '_b) Hashtbl.t *)