我有一个OCaml程序,模块有很多依赖于参数的函数,即“维度”。此参数在代码运行开始时确定一次,并保持不变直到终止。
我的问题是:如何更短地编写代码,以便我的函数都不需要“维”参数。这些模块调用彼此的函数,因此模块之间没有严格的层次结构(或者我看不到这一点)。
ocaml风格如何解决这个问题?我是否必须使用仿函数或是否有其他方法?
答案 0 :(得分:3)
您可能无法在不破坏模块之间的依赖关系的情况下评估参数,否则您只需在其中一个可从其他模块访问的模块中定义它。我想到的解决方案有点“大胆”。将参数定义为惰性值,并在其中暂停“全局单元格”的取消引用:
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)中,您已经传递了参数。