Max Haslbeck
Max Haslbeck

Reputation: 161

ocaml style: parameterize programs

I have a OCaml program which modules have lots of functions that depend on a parameter, i.e. "dimension". This parameter is determined once at the beginning of a run of the code and stays constant until termination.

My question is: how can I write the code shorter, so that my functions do not all require a "dimension" parameter. Those modules call functions of each other, so there is no strict hierarchy (or I can't see this) between the modules.

how is the ocaml style to adress this problem? Do I have to use functors or are there other means?

Upvotes: 4

Views: 77

Answers (1)

lukstafi
lukstafi

Reputation: 1895

You probably cannot evaluate the parameter without breaking dependencies between modules, otherwise you would just define it in one of the modules where it is accessible from other modules. A solution that comes to my mind is a bit "daring". Define the parameter as a lazy value, and suspend in it a dereference of a "global cell":

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)

The downside is that Lazy.force param is a bit verbose.

ETA: Note that "there is no strict hierarchy between the modules" is either:

  1. false, or
  2. you have a recursive module definition, or
  3. you are tying the recursive knot somewhere.

In case (2) you can just put everything into a functor. In case (3) you are passing parameters already.

Upvotes: 3

Related Questions