ocaml风格:参数化程序

时间:2013-10-30 17:26:11

标签: styles ocaml functor

我有一个OCaml程序,模块有很多依赖于参数的函数,即“维度”。此参数在代码运行开始时确定一次,并保持不变直到终止。

我的问题是:如何更短地编写代码,以便我的函数都不需要“维”参数。这些模块调用彼此的函数,因此模块之间没有严格的层次结构(或者我看不到这一点)。

ocaml风格如何解决这个问题?我是否必须使用仿函数或是否有其他方法?

1 个答案:

答案 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:请注意“模块之间没有严格的层次结构”是:

  1. false,或
  2. 您有一个递归模块定义,或
  3. 你在某个地方绑定了递归结。
  4. 在情况(2)中,您可以将所有内容都放入仿函数中。在情况(3)中,您已经传递了参数。