Область применения конструкторов модуля в OCaml - PullRequest
6 голосов
/ 19 января 2012

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

module type TYPE =
  sig
    type t
  end

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

Теперь я понимаю, что если я пишу за пределами Type.T 5, компилятор выдаст мне ошибку Error: Unbound constructor 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) Всегда ли нужно позволять снаружи создавать значение внутри модуля?

1 Ответ

6 голосов
/ 19 января 2012

1) Вы должны экспортировать объявление типа, в противном случае t считается абстрактным, а затем вам нужно определить и экспортировать конструкторы (см. 2)):

module type TYPE = sig
  type t =
    | TBot
    | T of int
    | TTop
end

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

2) Да, это прекрасно. Чтобы определить верх и низ, вам просто нужно определить (и экспортировать) новые конструкторы:

module type TYPE = sig
  ...
  val top: t
  val bot: t
end

module Type = struct
  ...
  let bot = TBot
  let top = TTop
end

3) Я не понимаю вашего вопроса

...