Having used haskell, I'm getting to grips with the core ocaml
language, but am somewhat confused by modules.

If I compile a simple file, X.ml:

 | module StringMap = Map.Make (String)
 |
 | type info = int list StringMap.t
 |
 | type named_values = {
 |    details : info
 | }
 |
 | ..... other stuff ....

then ocamlc will automatically build a x.cmi file that exports
everything. I can use this from another file Y.ml:

 | let x = X.StringMap.empty;;
 |
 | let y = { X.details=X.StringMap.add "xxx" [1;2;3] x }

although the X.StringMap.fn syntax seems a bit unwieldy.

If I want to restrict what gets exported, I have to
write an x.mli file. Whilst I've written mli files for simple
types and functions, I'm at a loss as how to write the contents
of the mli file that corresponds to the one automatically generated
above (specifically the StringMap bit).

A pointer would be much appreciated, either how to write the .mli
file, or a generally better way of doing this stuff.

Thanks,

Tim