我有一个 OCaml 程序,其中模块有很多依赖于参数的功能,即“维度”。此参数在代码运行开始时确定一次,并保持不变直到终止。
我的问题是:我怎样才能把代码写得更短,这样我的函数就不需要一个“维度”参数。这些模块相互调用函数,因此模块之间没有严格的层次结构(或者我看不到这一点)。
ocaml 风格如何解决这个问题?我必须使用仿函数还是有其他方法?
您可能无法在不破坏模块之间的依赖关系的情况下评估该参数,否则您只需在可以从其他模块访问它的模块之一中定义它。我想到的一个解决方案有点“大胆”。将参数定义为惰性值,并在其中暂停“全局单元”的取消引用:
let hidden_box = ref None
let initialize_param p =
match !hidden_box with None -> hidden_box := Some p | _ -> assert false
let param =
lazy (match !hidden_box with None -> assert false | Some p -> p)
缺点是Lazy.force param
有点冗长。
ETA:请注意,“模块之间没有严格的层次结构”是:
在情况(2)中,您可以将所有内容放入函子中。在情况 (3) 中,您已经在传递参数。