确保多次调用引用的结果相同



我在模块中调用一个函数来生成唯一的标签,例如。

MyMod.gensym

定义为

let gensym : string -> string =
let c = ref 0 in
fun s -> incr c; Printf.sprintf "!%s%d" s (!c)

但是,我希望能够在某些时间从使用此 gensym 的函数中获得可重现的结果,例如。

let reproducible = SomeMod.call x

第一次可能会返回["!a1"; "!a2"]第二次["!a3"; ...]

在这种情况下,我如何确保可重现的输出(例如,强制 ref 从相同的值开始(,但不需要更改其模块中 gensym 的实现?

您可以添加一个可选参数来重置它:

let gensym : ?reset:bool -> string -> string =
let c = ref 0 in
fun ?(reset=false) s ->
if reset then
c := 1
else
incr c;
Printf.sprintf "!%s%d" s (!c)

最新更新