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