title: Scope of constructors of a module in OCaml
body: <p>I have defined the following interface and module:</p>
  
  <pre><code>module type TYPE =
    sig
      type t
    end
  
  module Type = (struct
    type t =
      | TBot
      | T of int
      | TTop
  end: TYPE)
  </code></pre>
  
  <p>Now I realize that If I write outside <code>Type.T 5</code>, the compiler will give me en error <code>Error: Unbound constructor Type.T</code>. If I remove the signature and keep the module, the error will disappear.</p>
  
  <p>1) So my first question is, how to change the signature such that I can use the constructors outside?</p>
  
  <p>2) One way is to define a constructor explicitly as follows, do you think it is a conventional way? One disadvantage I can see now is it does not allow to construct <code>TBot</code> or <code>TTop</code>.</p>
  
  <pre><code>module type TYPE =
    sig
      type t
      val make : int -&gt; t
    end
  
  module Type = (struct
    ...
    let make (i: int) : t =
        T i
  end: TYPE)
  </code></pre>
  
  <p>3) Is it always necessary to let outside be able to construct a value inside a module?</p>