Объем конструкторов модуля в OCaml

я определил следующий интерфейс и модуль:

module type TYPE =
  sig
    type t
  end

module Type = (struct
  type t =
    | TBot
    | T of int
    | TTop
end: TYPE)

Теперь я понимаю, что если я напишу вне Type.T 5 , компилятор выполнит дайте мне en error Ошибка: несвязанный конструктор Type.T . Если я уберу подпись и оставлю модуль, ошибка исчезнет.

1) Итак, мой первый вопрос: как изменить подпись, чтобы я мог использовать конструкторы снаружи?

2) Один из способов - явно определить конструктор следующим образом, как вы думаете, это обычный способ? Один недостаток, который я сейчас вижу, заключается в том, что он не позволяет создавать TBot или TTop .

module type TYPE =
  sig
    type t
    val make : int -> t
  end

module Type = (struct
  ...
  let make (i: int) : t =
      T i
end: TYPE)

3) Всегда ли необходимо позволять извне создавать значение внутри модуля?

6
задан SoftTimur 19 January 2012 в 09:45
поделиться