4

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

我的问题是:我怎样才能把代码写得更短,这样我的函数就不需要一个“维度”参数。这些模块相互调用函数,因此模块之间没有严格的层次结构(或者我看不到这一点)。

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

4

1 回答 1

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. 错误的,或
  2. 你有一个递归模块定义,或者
  3. 你在某个地方打了一个递归结。

在情况(2)中,您可以将所有内容放入函子中。在情况 (3) 中,您已经在传递参数。

于 2013-10-30T17:59:42.337 回答