Я определил следующий интерфейс и модуль:
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) Всегда ли нужно позволять снаружи создавать значение внутри модуля?